Je cherche à faire un prédicat qui compare deux listes terme par terme:
Je vois pas comment le faire ... :\
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ?- comparer([a,b,c,d,e],[a,y,c,d,z],Resultat). Resultat=[1,3,4]
Je cherche à faire un prédicat qui compare deux listes terme par terme:
Je vois pas comment le faire ... :\
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ?- comparer([a,b,c,d,e],[a,y,c,d,z],Resultat). Resultat=[1,3,4]
A mon avis, il y a 3 cas à envisager:
1) comp([X|T1], [X | T2], .......
2) comp([X | T1], [Y | T2], ....
3°) "cas terminal" comp(_, _, ...
Je laisse les .. pour que tu trouves les arguments à ajouter.
Je l'ai fait avec 5 arguments au total.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
J'ai fais ça :
et j'appel avec comp([a,b,c,a,x],[a,e,c,a,f],N,0,R).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 comp([X|T1], [X|T2],N,Compteur,R):- comp(T1,T2,N,NCompteur,R), Compteur is NCompteur+1. comp([X|T1], [Y|T2],N,Compteur,R):- comp(T1,T2,N,Compteur,R). comp(_,_,_,R,R).
mais ça ne fonctionne pas :\
Il faut que tu mémorises dans une liste les indices où les premiers élélments de liste sont identiques.
Il faut aussi que tu incrémentes le compteur de tours.
P.S. Je l'ai fait aussi d'une autre manière avec 4 arguments et qui est aussi plus "dans l'esprit de Prolog".
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Bonjour,
J'ai cherche à faire la même chose, j'arrive à obtenir un résultat mais pas celui voulu.
Voici le code:
En testant le code avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 comp(_,_,0,[0]). comp([X|T1],[X|T2], Compteur, [Compteur|Q]):- comp(T1,T2, NCompteur, Q), Compteur is NCompteur + 1,!. comp([X|T1],[Y|T2], Compteur, L3):- X\=Y,comp(T1,T2,NCompteur, L3).
J'obtiens bien l'indice 1 et 0 dans ma liste mais pas le quatrième.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ? - comp([a,r,b,r,e],[a,r,l,e,e],N,X)
Vous obtenez bien les indices 0 et 1 mais pas pour les raisons que vous croyez !
essayez avec comp([r,a,b,r,e],[a,r,b,r,e],N,X).
Lisez bien tout ce qui a été écrit avant, inspirez vous des codes montrés.
Bon courage !
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Bonsoir,
Merci pour votre réponse, cependant je dois mal comprendre quelque chose, soit dans la récursivité ou bien le backtracking.
Je reviens avec ce code:
Cependant, je m'aperçois que mon code n'est pas bon mais je ne sais pas pourquoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 comp(_,_,0,[]). comp([X|T1],[X|T2], Compteur, [Compteur|Q]):- comp(T1,T2, NCompteur, Q), Compteur is NCompteur + 1. comp([X|T1],[Y|T2], Compteur, L3):- X\=Y,comp(T1,T2,NCompteur, L3),Compteur is NCompteur + 1.
Bonjour
Pour bien comprendre ce qui se passe, pensez à utiliser gtrace.
Tapez le dans la console SWI-Prolog puis lancez la commande.
Vous obtiendrez une boîte de dialogue où vous pourrez voir toutes les valeurs des variables dans l'évolution de votre code.
Maintenant que se passe-t-il lorsque vous lancez comp([a,r,b,r,e],[a,r,l,e,e],N,X). ?
Prolog utilise les clauses dans l'ordre d'écriture :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ?- comp([a,r,b,r,e],[a,r,l,e,e],N,X). N = 0, X = [] ; N = 1, X = [1] ; N = 2, X = [2, 1] ; N = 3, X = [3, 2] ; N = 4, X = [4, 3] ; N = 5, X = [5, 4, 1] ; false.
comp([a,r,b,r,e],[a,r,l,e,e],N,X).
Première clause trouvée:
comp(_,_,0,[]).
Cette clause exprime le fait que quelque soit les deux premiers arguments de comp, N est instancié avec 0 et X avec [].
C'est bien ce qui est obtenu en premier résultat.
Vous tapez ensuite ';'. Celà veut sire que vous demandez à Prolog de continuer les recherches.
Il regarde la deuxième clause :
Les unifications faites sont
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 comp([X|T1],[X|T2], Compteur, [Compteur|Q]):- comp(T1,T2, NCompteur, Q), Compteur is NCompteur + 1.
X unifié à a
T1 unifié à [r,b,r,e]
T2 unifié à [r,l,e,e]
On appelle donc comp([r,b,r,e], [r,l,e,e], NCompteur, Q).
La premiere clause est donc rappelée
NCompteur est unifé à 0, Q à [].
On revient à la clause précédente
Celle-ci :
Comme NCompteur est unifié à 0 Compteur est unifié à 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 comp([X|T1],[X|T2], Compteur, [Compteur|Q]):- comp(T1,T2, NCompteur, Q), Compteur is NCompteur + 1.
[Compteur|Q] est unifié à [1|[]] c'est-à-dire [1].
etc etc,
Essayez de trouver les explications des autres résultats obtenus en suivant le même processus.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager