J'utilise SWI Prolog, le code suivant est utilisé dans mes devoirs (le code est le travail à domicile, mais nécessaire pour écrire les méthodes au cours nécessite):Prolog se inifini en demandant une autre solution
nat(0).
nat(s(X)) :-
nat(X).
plus(0,N,N) :-
nat(N).
plus(s(M),N,s(Z)) :-
plus(M,N,Z).
times(0,N,0) :-
nat(N).
times(s(M),N,Z) :-
times(M,N,W),
plus(W,N,Z).
exp(s(M),0,0) :-
nat(M).
exp(0,s(M),s(0)) :-
nat(M).
exp(s(N),X,Z) :-
exp(N,X,Y),
times(X,Y,Z).
exp(a,b,c)
signifie c=b^a
.
Il est copié directement à partir du livre: "L'art de Prolog: Techniques avancées de programmation".
Quand je lance la requête suivante:
exp(s(s(0)),L,s(s(s(s(0))))).
Je reçois une réponse:
L = s(s(0))
Mais quand je demande une autre réponse en entrant; Je reçois une boucle infinie (se terminant par une erreur hors pile), je m'attendais à obtenir faux.
Quel est le problème dans le code? Y at-il un code qui fait la même chose (avec la même représentation des nombres naturels) mais se comporte comme je l'ai décrit? et si oui, quelques conseils ou suggestions seraient d'une grande aide.
Merci d'avance.
de 'exp/3'. Moyens' exp (a, b, c) '' c = b^a'? –
oui, je l'ai ajouté à la question – PrologNewb
[Relié] (http://stackoverflow.com/questions/9740271/prolog-predicate-infinite-loop). – false