私は 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 を実行しています。
アドバイスをいただければ幸いです。