Utilisation de Prolog: étant Donné une liste de vérifier si le premier élément de la liste est égal au dernier élément
À l'aide de prologue, j'ai créer une règle qui détermine, quand on donne une liste, si le premier élément de la liste est égal au dernier élément de la liste. Ci-dessous est ma façon de penser.
The Base Cases:
1) If The Parameter Is Not A List: Return False
2) If The Parameter Is A List But Empty: Return False
3) If The Parameter Is A List But Has One Element: Return False
The Recursive Step:
Recursively Going Through The List Getting The
First Element And TheLast Element Then Compare
fela() :- false. <-- Base Case One
fela([]):-false. <-- Base Case Two
fela([H]):-false. <-- Base Case Three
fela([H|T]):- H1 is H, H1 == T, fela(T,H1). <-- Recursive Step
Ci-Dessous Sont Fonction De Premier, Dernier, Membre
first(F, [F|_]).
last(L, [H|T]) :- last(L, T).
member(X, [X|_]).
member(X, [_|T]) :- member(X, T).
Je vais avoir des ennuis avec mon récursive pas, je suis pas sûr de savoir comment stocker le premier élément, et la traversée de la liste et d'obtenir le dernier élément, puis de comparer les résultats d'un vrai/faux. Quelqu'un pourrait-il m'aider
Merci,
Erik 🙂
sur DONC, vous êtes censé accepter l'une des réponses, qui vous a aidé le plus. 🙂
OriginalL'auteur Erik-Smies | 2013-07-19
Vous devez vous connecter pour publier un commentaire.
Ici est très simple:
Regarder ça pendant une minute et laissez vraiment sombrer dans.
En fait, il serait juste, mais votre
last/2
n'est-ce pas, tout simplement en parcourant la liste d'aucun cas de base qui ne sera jamais réussir. Une bonnelast/2
devrait ressembler à ceci:Je vois beaucoup de la confusion des idées dans l'analyse de cas. Pour une chose, dans le Prologue, vous n'avez pas renvoyer explicitement le vrai et le faux. Il vous suffit de correspondre à ce que vous match et le reste est un échec. Lorsque vous traitez avec des listes, vous hérite automatiquement de la base de cas de la liste vide et inductif cas d'un élément et le reste de la liste. Ce n'est pas suffisant pour mettre en œuvre
fela/1
à partir de zéro parce que vous n'avez aucun moyen de se souvenir de ce que votre premier élément a été. Donc, si vous voulez construire à partir de zéro, vous aurez besoin d'un helper prédicat, donc vous pouvez garder le passage du premier élément. Ça va ressembler à ceci:Avis que nous avons préservé l'analyse d'un cas de base, on inductive cas pour la manipulation de la liste. C'est la situation habituelle lors du traitement d'une structure de données récursive.
first/2
est un bon exemple de cas où vous ne suivez pas cette règle, parce que vous ne sont pas intéressés dans l'un des cas. La construction du prédicat defirst/2
etlast/2
vous permet d'échapper à l'analyse du cas de problème, et à l'est (à mon avis) plus souvent ce qui se passe dans la pratique.Maintenant, je veux à certaines de vos idées ici pour plus de commentaires. Tout d'abord,
H1 is H
est certainement pas ce que vous voulez.is/2
est exclusivement pour la réduction des expressions arithmétiques. Vous aurez toujours une variable sur la gauche et une expression sur la droite ou elle n'est pas significative. Vous êtes en train de faire une sorte d'affectation ici, mais mêmeH1 = H
n'est pas utile ici, car tout en Prolog a des variables, il n'a pas assignables.H1 is H, H1 == T
dit, de manière invraisemblable, que H est à la fois la tête de la liste et l'équivalent de la queue. Ce n'est pas vraiment possible, parce que la queue est une liste, et la tête est un élément. Même si vous pourrait créer une situation où cela était vrai, cela ne serait pas intéressant de ce prédicat. Votre récursive étape ici est vraiment étrange.Un autre problème avec votre analyse de cas, le cas n ° 3 doit être vrai. Avec
[X]
,X
est à la fois le premier et le dernier élément de la liste, de sortefela/1
devrait être trivialement vrai pour tous un élément des listes.Je serais partisan d'une autre étude. Je pense que vous avez de drôles de notions un peu plus de lecture correct.
Mon plaisir. Upvote/accepter? 🙂 Je pense que vous serez très bien, il suffit de garder à elle.
les OP ne peuvent pas upvote encore vous, Daniel. 🙂 (ils ont besoin de 15 rep). cudos pour le lien de Robert Harper blog.
Il fait tellement longtemps que je ne me souviens pas de l'ordre les restrictions sont levées.
OriginalL'auteur Daniel Lyons