0

これまでのところ、私のプログラムは 2 つの数値を足し合わせることができます。

s(0)を表す1s(s(0))表す2など

p(0)を表す-1p(p(0))-2等です。

そのようなプログラムを呼び出せるようにしたい

add2(s(s(0)), p(0), Z).

戻り値

Z = s(0).

私のコードは次のとおりです。

numeral(0).
numeral(s(X)) :- numeral(X).

add(0,X,X).
add(s(X),Y,s(Z)) :- add(X,Y,Z).

numeral(X+Y) :- numeral(X), numeral(Y).

add2(X,Y,Z):-add(X,Y,Z).
add2(X+Y, Z,A) :-add(X,Y,R),add2(R,Z,A).
add2(Z,X+Y,A) :-add(X,Y,R),add2(Z,R,A).

numeral(p(X)) :- numeral(X).

add2(p(X),Y,p(Z)) :- add2(X,Y,Z).
p(s(X)) =:= 0.
s(p(X)) =:= 0.

私の論理はp(s(0))、リストにある場合、..と同等になるというもの0でしたが、私は間違っていました。これでどこに行くべきか誰か知っていますか?

4

1 に答える 1

1

各数値は、次の 3 つの方法のいずれかでのみ表すことができます。

  • 0- ヌル;
  • s(X)- 次に、Xは数字です。
  • p(X)- 以前、Xは数字です。

add2/32 つの数字を取り、それらの合計を返す必要があります。可能な引数ごとに手動で定義できます。

add2(0, 0, 0).
add2(0, s(X), Y) :- Y = s(X).
add2(0, p(X), Y) :- Y = p(X).

add2(s(X), 0, Y) :- Y = s(X).
add2(s(X), s(Y), Z) :- add2(X, Y, s(s(Z))).
add2(s(X), p(Y), Z) :- add2(X, Y, Z).

add2(p(X), 0, Y) :- Y = p(X).
add2(p(X), s(Y), Z) :- add2(X, Y, Z).
add2(p(X), p(Y), Z) :- add2(X, Y, p(p(Z))).

うまく機能します:

?- add2(s(s(0)), p(0), Z).
Z = s(0) .

ルールの多くのケースadd2/3が実際には重複しており、削除できることは注目に値します。

add2(0, X, X).
add2(X, 0, X).

add2(s(X), s(Y), Z) :- add2(X, Y, s(s(Z))).
add2(s(X), p(Y), Z) :- add2(X, Y, Z).

add2(p(X), s(Y), Z) :- add2(X, Y, Z).
add2(p(X), p(Y), Z) :- add2(X, Y, p(p(Z))).
于 2013-10-27T07:54:15.497 に答える