2

私は Prolog を初めて使用し、組み込みの述語を使用せずに、自然数に対していくつかの基本的な算術演算を実装する必要があります。

I は単項表記で自然数 Term を表します。つまり、I は定数 0 と、再帰的な後継ファンクターs [つまり、4 = s(s(s(s(0))))] を持ちます。上記の表記に関して、算術演算を実装します。

一連のルールは次のとおりです。

% nat(N)/1 ---> N is a natural number
nat(0).
nat(s(X)) :-
    nat(X).

% add(X,Y,Z)/3 ---> Z = X + Y
add(X,0,X) :-
    nat(X).
add(X,s(Y),s(Z)) :-
    add(X,Y,Z).

% mult(X,Y,Z)/3 ---> Z = X * Y
mult(0,X,0) :-
    nat(X).
mult(s(X),Y,Z) :-
    mult(X,Y,XY),
    add(XY,Y,Z).

今、クエリすると:

?- mult(s(s(0)), s(s(s(0))), RES).

私はすべてOKです:

RES = s(s(s(s(s(s(0))))))。

クエリを実行すると: (6/3=? と尋ねたい)

?- mult(X, s(s(s(0))), s(s(s(s(s(s(0))))))).

無限ループに陥って SO になる

mult 述語で再帰呼び出しの順序を変更しても、役に立ちません。

mult(s(X),Y,Z) :-
    add(XY,Y,Z),
    mult(X,Y,XY).

Linux マシンで swi-prolog を実行しています。

アドバイスをいただければ幸いです。

4

1 に答える 1

1

OK、簡単な修正があります (間違った再帰):

% add(X,Y,Z)/3 ---> Z = X + Y
add(0,X,X) :-
    nat(X).
add(s(X),Y,s(Z)) :-
    add(X,Y,Z).

そしてマルチ:

mult(s(X),Y,Z) :-
   add(XY,Y,Z),
   mult(X,Y,XY).

望ましい結果が得られます。

まだ、クエリの場合:

?- mult(X,Y,s(s(s(s(s(s(0))))))).

X * Y = s(s(s(s(s(s(0)))))) に対応する X、Y のすべてのペアを出力し、最後のペアの後、無限ループに入ります。私にとって未知の理由。

于 2016-03-19T14:22:53.190 に答える