2014-01-24 114 views
3

我想知道@<在Prolog中意味着什麼? 我遇到過這種符號在這行代碼一邊唸叨大橋和火炬問題:@<Symbol In Prolog

select_one_or_two(L,[Sel1,Sel2],L2) :- 
    select(Sel1,L,NewL), 
    select(Sel2,NewL,L2), 
    [email protected]<Sel2. 

回答

5

的比較運營商與@啓動都比不需要的那些比較一般。對於運算符(如</2),只能比較數值和表達式(涉及用數字值實例化的文字數字和變量)。所以,用</2你可以這樣做:

?- X = 2, Y = 3, X + Y < 2*Y. 
X = 2, 
Y = 3. 

?- X = 2, Y = 3, X + Y > 2*Y. 
false. 

?- 

但如果表達式不計算爲一個已知的數字,你會得到在下列情況下的錯誤:

?- Y = 3, X + Y < 2*Y. 
ERROR: </2: Arguments are not sufficiently instantiated 

或者:

?- a < b. 
ERROR: </2: Arithmetic: `a/0' is not a function 

但是,使用@</2可以比較序言中許多不同類型的對象。比較評估遵循@Ankur提供的鏈接中描述的規則。要了解這些規則,你需要知道什麼Prolog的術語意味着,如termfunctor,​​等(參見,例如,Prolog Terms

看一些例子:

?- a @< b. 
true. 

?- a(1) @< a(2). 
true. 

?- b(1) @< a(2). 
false. 

?- 20 @< a. 
true. 

這些是非常直接的,遵循規則。這裏有一個更有趣的情況下(從上面):

?- Y = 3, X + Y @< 2*Y. 
false. 

爲什麼會X + Y被認爲是「不低於」 2*Y? Prolog的內部會看看這個爲:

`+(X,3) @< *(2,3).` 

(注意Y被實例化3)這些是複合詞(他們不是單個原子或變量)。如果我們通過比較規則,匹配規則爲:

複合詞首先檢查自己的元數,然後對他們的仿 名(按字母順序),最後遞歸地對他們的論點, 最左邊爭論第一。

術語元數是2。算符名稱分別+*。那些是不同的。在ASCII整理序列中,+出現在*之後。因此,這是不正確的,+「小於」 *,因此不正確的+(X,3) @< *(2,3).因此,它是不正確的Y = 3, X + Y @< 2 * Y.

還要注意@</2不計算數字的表達式。因此,即使XY實例化爲值,您將獲得:

?- X = 2, Y = 3, X + Y @< 2*Y. 
false. 

然而,當我們有</2在這裏,這是真的,因爲表達X + Y < 2*Y,計算時,是真實的。當變量是簡單統一的,它知道,然而,你會:

| ?- X @< Y. 

yes 

但在另一方面:

| ?- X = 2, Y = 1, X @< Y. 

no 

在這種情況下X @< Y被視爲2 @< 1由於統一X2Y1和數字規則踢英寸

說了這麼多,如何在謂語使用@</2select_one_or_two使謂詞可以在各種對象的列表上使用,而不僅僅是數字或完全實例化的數字表達式。如果它使用</2,那麼下面將工作:

?- select_one_or_two([2,1,3], X, Y). 
X = [2, 3], 
Y = [1] ; 
X = [1, 2], 
Y = [3] ; 
X = [1, 3], 
Y = [2] ; 
false. 

但下列失敗:

?- select_one_or_two([b,a,c], X, Y). 
ERROR: </2: Arithmetic: `b/0' is not a function 
?- 

然而,隨着@<運營商,它的工作原理:

?- select_one_or_two([b,a,c], X, Y). 
X = [b, c], 
Y = [a] ; 
X = [a, b], 
Y = [c] ; 
X = [a, c], 
Y = [b] ; 
false. 
+1

謝謝!好的回答:-) – parisa

+0

有點晚了,但是這是一個錯字:'在這種情況下,X @ narn

+0

@narn永遠不會太遲以修復一個錯字!感謝您找到它。 – lurker