0

私は 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 になると予想していました。

コードの問題は何ですか?(自然数の同じ表現で) 同じことをするが、私が説明したように動作するコードはありますか? もしそうなら、いくつかの指針や提案が大いに役立つでしょう。

前もって感謝します。

4

1 に答える 1