J'essaie d'implémenter un prédicat findall dans Prolog (oui, je sais qu'il est intégré, c'est pour une affectation).La règle PROLOG renvoie uniquement le premier résultat
Il est écrit comme suit:
my_findall(N,P,Pred,L) :- Pred, not(new(N,P)), !, assert(new(N,P)), my_findall(N1,P1,Pred,L1), L=[N,P,L1], retract(new(N,P)).
my_findall(_,_,_, []).
Pour une raison quelconque, il ne me donne que la première solution et arrête là, comme si le second appel à my_findall échoue. Si je comprends bien, le mécanisme de backtracking devrait passer en revue toutes les options possibles, qui devraient inclure toutes les options pour appeler Pred (N, P), même si le second appel échoue au premier essai (la première option essayée pour Pred a déjà été affirmé), il devrait essayer toutes les autres options avant d'abandonner et aller à my_findall ((,), _, []).
Si ce n'est pas comme cela que cela fonctionne, existe-t-il un moyen de forcer ce type de comportement sans réécrire complètement la solution?
Avec quel interpréteur prologue travaillez-vous? – liori
Les findalls intégrés sont findall/3 et findall/4. Lequel essayez-vous de mettre en œuvre? – Kaarel