私は SWI Prolog を使用しています。次のコードが宿題で使用されています (コードは宿題ではありませんが、コースで必要なメソッドを記述するために必要です)。
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)
を意味しc=b^a
ます。
これは、「The Art of Prolog: Advanced Programming Techniques」という本から直接コピーしたものです。
次のクエリを実行すると:
exp(s(s(0)),L,s(s(s(s(0))))).
私は答えを得ます:
L = s(s(0))
しかし、入力して別の答えを求めると;
L = s(s(0)) ;
無限ループ (スタック不足エラーで終了) が発生します。false になると予想していました。
コードの問題は何ですか?(自然数の同じ表現で) 同じことをするが、私が説明したように動作するコードはありますか? もしそうなら、いくつかの指針や提案が大いに役立つでしょう。
前もって感謝します。