5
votes

Programme Prolog capable de trouver trois valeurs consécutives et répétitives

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!


0 commentaires

3 Réponses :


1
votes

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.


1 commentaires

Bonjour, j'apprécie la réponse rapide, mais je n'ai vraiment pas compris l'aide de cette réponse 😞



1
votes

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


2 commentaires

find([X,X,X],X). est inutile. _ peut être []


@MaxB Err .. oui!



1
votes
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.

0 commentaires