0

我的文件中有以下 prolog 表达式,这是非常不言自明的。我已经正确实施和测试了这条规则(称之为 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 中的整数部分(之前;)比实数部分先指定(我交换了两者,它开始以相反的方式工作)。它试图与第一部分统一并反复进行。由于那里没有这样的事实,它只会进入无限循环。请指定另一种方法来做同样的事情。这是我的任务中唯一剩下的部分,我被它打动了好几个小时。

提前致谢!

4

2 回答 2

0

问题在于“;”的优先级 与“,”运算符相比。使用括号或写出两个单独的规则:

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 回答
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)).

对于特定的输入,您应该只调用一次 cal 函数。冗余呼叫会导致问题。

于 2011-04-04T15:23:18.557 回答