2012-04-02 2 views

Répondre

2

L'exécution de Prolog est une question de choix. Ici, un point de choix est laissé à chaque étape de récurrence par le prédicat bit/1. Lorsque vous demandez à Prolog de vous fournir une autre solution, elle revient simplement au point de choix le plus jeune. Ici, au lieu de passer par la première clause de bit/1 et de lier H à 0, il passera par la deuxième clause et liera H à 1. Une fois que les deux clauses ont été choisies, Prolog reviendra à un point de choix plus ancien, etc ... jusqu'à ce que finalement tous les points de choix soient épuisés et le programme retourne false..

vous pouvez essayer vous-même avec le trace/0 prédicat:

?- trace, gen(3, Result). 
+0

oui je pense que je l'ai eue merci .. –

2

Puis-je vous offrir une définition en avant plus droite d'abord:

gen(N, Xs) :- 
    length(Xs, N), 
    maplist(between(0,1), Xs). 

Dans cette définition toutes les parties récursives sont désormais cachés dans certains built-ins. Le premier objectif garantit que Xs est une liste de longueur N. Et l'objectif suivant en sorte que chaque élément est compris entre 0 et 1. Si vous regardez les réponses, vous vous rendrez compte dans quel ordre les solutions sont énumérées:

 
?- gen(4, Xs). 
Xs = [0,0,0,0] ; 
Xs = [0,0,0,1] ; 
Xs = [0,0,1,0] ; 
Xs = [0,0,1,1] ; 
Xs = [0,1,0,0] ; 
Xs = [0,1,0,1] ; 
Xs = [0,1,1,0] ; ... 
0

Ce prédicat génère tous les numéros (avec commande) en binaire système bien pour le comprendre, vous devez comprendre prolog backtracking, vous pouvez dessiner un arbre de substitution pour le comprendre

Questions connexes