0

私のファイルには、かなり自明な次のプロローグ式があります。このルール (1 と呼ぶ) に必要なすべての必須関数を実装し、正しくテストしました。

cal(plus(X,Y),Z):-cal(X,int(Z1)),cal(Y,int(Z2)),add(Z1,Z2,Z3),Z=int(Z3) ; cal(X,real(Z1)),cal(Y,real(Z2)),add(Z1,Z2,Z3),Z=real(Z3).

何時間も試した後、次のことがわかりませんでした。

?-call(plus(int(9),int(10)),Z). 

正しく動作し、戻ります:-

Z = int(19).

しかし、それは統一しません

?-call(plus(real(9.0),real(10.0),Z).

私は多くのことを試しましたが、これはルール1の整数部分(;の前)が実部分よりも最初に指定されたためであると結論付けました(2つを交換したところ、逆の方法で機能し始めました)。前編との融合を図りながら繰り返していく。そこにはそのような事実がないので、無限ループに陥ります。同じことを行う別の方法を指定してください。これが私の割り当ての残りの部分であり、私は何時間もそれに打ちのめされています。

前もって感謝します!

4

2 に答える 2

0

さて、これが答えです。

cal(plus(X,Y),G,Z):-cal(X,G,Z1),cal(Y,G,Z2),((Z2 = int(Z22),Z1 = int(Z11));(Z2 = real(Z22),Z1 = real(Z11))),add(Z11,Z22,Z3),(Z3=int(Z4) -> Z=int(Z3); Z=real(Z3)).

特定の input に対してcal 関数を 1 回だけ呼び出す必要があります。冗長な呼び出しは問題を引き起こします。

于 2011-04-04T15:23:18.557 に答える
0

問題は、「;」の優先順位にあります。対 "," 演算子。括弧を使用するか、2 つの別個のルールを記述します。

cal(plus(X,Y),Z):- 
    cal(X,int(Z1)),
    cal(Y,int(Z2)),
    add(Z1,Z2,Z3),
    Z=int(Z3).
cal(plus(X,Y),Z):- 
    cal(X,real(Z1)),
    cal(Y,real(Z2)),
    add(Z1,Z2,Z3),
    Z=real(Z3).
于 2011-04-04T15:05:25.590 に答える