2011-04-04 72 views
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中的整數部分(before;)首先被指定爲實部(我交換了兩部分,並且它開始以相反方式工作)。它試圖與第一部分相結合並一再進行。由於沒有這樣的事實,它就會陷入無限循環。 請指定一種替代方法來做同樣的事情。這是我的任務中唯一剩下的部分,我已經打了好幾個小時了。

在此先感謝!

回答

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功能只有一次針對特定的輸入。冗餘呼叫導致問題。

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). 
+0

你不明白這個問題。你的也不行。同樣的錯誤。 – higherDefender 2011-04-04 15:14:44

相關問題