comme le titre, dit, j'ai besoin d'écrire un programme qui trouve trois valeurs égales et consécutives à partir d'une liste, par exemple:
find(_List, X) :- length(X, Size), Size = 3, format('X = ~w', [X]). find([Equal, Equal|Tail], X) :- is_list(X), append([Equal, Equal], X, Y), find([Equal|Tail], Y). find([Equal, Equal|Tail], _X) :- append([Equal, Equal], [], Y), find([Equal|Tail], Y). find([_Equal, Diferent|Tail], _X) :- find([Diferent|Tail], []).
Mon quotidien est la programmation fonctionnelle, mais j'ai un peu de mal avec ce que fait mon programme car il ne produit jamais de résultats concrets (par exemple: sorties X = [_7714,_7720,_7726]
)
Le programme que j'ai réalisé est le suivant:
find([o,o,a,b,b,b,c,c], X) X = [b,b,b].
Qu'est-ce que je manque ici ou que suis-je déroutant dans la théorie prologue. Pour moi, mon programme a du sens, je ne comprends pas vraiment où le code est exécuté à chaque étape (même en utilisant trace.
).
Toute aide est totalement appréciée! Merci d'avance!
3 Réponses :
Réponse partielle seulement. En utilisant le prédicat standard append/3
de facto:
| ?- append(_Suffix, [X,X,X|_Prefix], [o,o,a,b,b,b,c,c]). X = b ? ; no
Mais passer d'ici à une liste avec l'élément répété devrait être facile.
Bonjour, j'apprécie la réponse rapide, mais je n'ai vraiment pas compris l'aide de cette réponse 😞
Que dis-tu de ça:
Vous avez trois éléments identiques X
au début d'une liste si vous avez une liste qui ressemble à ceci; ici le deuxième paramètre est la "sortie":
?- find([o,o,a,b,b,b,c,c], X). X = b ; <- I found b but maybe there are more false. <- Nah, actually not
Et donc:
find([X,X,X|_],X). % We have three identical elements X % reflected in "output" X in a list of more than 3 % elements . % or find([X,X,X],X). % We have three identical elements X % reflected in "output" X in a list of exactly 3 % elements . % or find([_|Xs],X) :- % We have three identical elements X in a list if find(Xs,X). % we have three identical elements X in the rest
find([X,X,X],X).
est inutile. _
peut être []
@MaxB Err .. oui!
triple(X) --> [X,X,X]. ... --> [] | [_], ... . find(Xs, X) :- phrase(( ..., triple(X), ... ), Xs). find2(Xs, X) :- phrase(( ..., [X,X,X], ... ), Xs). Note that a name like find/2 does not fit nicely into a descriptive mindset as it suggests an operationalizing viewpoint which will hamper your understanding of Prolog. So instead of issuing commands like "find that sequence", simply describing what is, is often preferable.