2016-03-19 13 views
1

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

私は自然数を表します。単項表記は、定数が0であることを意味し、再帰的後継関数はであり、です。 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). 

、私は照会する場合:

RES = Sで(S(S(S(S:

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

私はOKすべてを取得します(s(0))))))。

私は照会する場合:(?= 6月3日をお願いしたい)

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

私は無限ループで立ち往生してS.O.を取得

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

私はLinuxマシン上のSWI-プロローグ実行します。

は、私はそれが解決しないMULT述語における再帰呼び出しの順序を変更しても。

あなたのアドバイスをいただきありがとうございます。

% 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:

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

は、望ましい結果が得られます

答えて

0

OK、クイックフィックス(間違った再帰)があります。

まだ、クエリの:

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

それが出力に対応するX、Yのすべてのペア:X * Y = Sで(S(S(S(S(S(0))) )))、そして最後のペアの後、無限のループに入ってしまいます。

関連する問題