2010-06-05 61 views
5

我是Prolog的新手。我需要寫一個整數加法器,將0-9之間的數字添加到其他數字0-9,併產生一個解決方案0-18。這就是我想做的事:Prolog初學者:如何統一算術比較運算符或如何獲得一組var到數值範圍

% pseudo code 
add(in1, in2, out) :- 
    in1 < 10, 
    in2 < 10, 
    out < 18. 

我希望能夠調用它像這樣:

要檢查它是否是一個有效的加法:

?- add(1,2,3). 
true. 
?- add(1,2,4). 
false. 

隨着一人失蹤變量:

?- add(X,2,3). 
X = 1. 
?- add(1,4,X). 
X = 5. 

使用多個缺少變量:

?- add(X,Y,Z). 
% Some output that would make sense. Some examples could be: 
X=1, Y=1, Z=2 ; 
X=2, Y=1, Z=3 ...... 

我意識到這可能是一個相當簡單的問題,它可能是非常簡單的。然而,根據該Prolog tutorial我使用:

「不同於統一算術比較運算符運營商不能使用,得到的值到一個變量時在每一側的每個術語已經被實例化的只能進行評估。」。

回答

0

解決方案:

lessThanTen(9). 
lessThanTen(8). 
lessThanTen(7). 
lessThanTen(6). 
lessThanTen(5). 
lessThanTen(4). 
lessThanTen(3). 
lessThanTen(2). 
lessThanTen(1). 
lessThanTen(0). 

addSimple(Add1,Add2,Sol) :- 
    lessThanTen(Add1), 
    lessThanTen(Add2), 
    Sol is Add1+Add2. 
1

這個怎麼樣?:

add(X,Y,Z) :- 
     Z is X + Y, 
     X < 10, 
     Y < 10, 
     Z < 19. 

問題:這個作品很好的形式add(1,1,X)因爲Z的的<調用之前實例化的查詢,但沒有當你問add(X,1,2)。您可以使用var/1來區分查詢的種類(var/1告訴您一個變量是否無效),但聽起來很痛苦。

+0

是的,這不工作,因爲你在你的答案中描述。 – sixtyfootersdude 2010-06-05 20:35:38

6

所有現代的Prolog系統都提供了有限的域約束,它們是可以在所有方向上使用的真正的關係(與更多的低級算術謂詞(如/ 2和>/2)相比)。在SWI-Prolog的:

:- use_module(library(clpfd)). 

plus(X, Y, Z) :- 
     [X,Y] ins 0..9, 
     X + Y #= Z. 

結果你的例子:

?- plus(1,2,3). 
true. 

?- plus(1,2,4). 
false. 

?- plus(X,2,3). 
X = 1. 

?- plus(1,4,X). 
X = 5. 

?- plus(X,Y,Z). 
X in 0..9, 
X+Y#=Z, 
Y in 0..9, 
Z in 0..18. 

因爲謂詞可以在所有方向上使用,但它不再是有意義的稱之爲「添加/ 3」,作爲這將暗示一個方向,但謂詞真正描述了關係持有的時間,因此更一般。