我想知道@<
在Prolog中意味着什麼? 我遇到過這種符號在這行代碼一邊唸叨大橋和火炬問題:@<Symbol In Prolog
select_one_or_two(L,[Sel1,Sel2],L2) :-
select(Sel1,L,NewL),
select(Sel2,NewL,L2),
[email protected]<Sel2.
我想知道@<
在Prolog中意味着什麼? 我遇到過這種符號在這行代碼一邊唸叨大橋和火炬問題:@<Symbol In Prolog
select_one_or_two(L,[Sel1,Sel2],L2) :-
select(Sel1,L,NewL),
select(Sel2,NewL,L2),
[email protected]<Sel2.
的比較運營商與@
啓動都比不需要的那些比較一般。對於運算符(如</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的術語意味着,如term
,functor
,等(參見,例如,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
不計算數字的表達式。因此,即使X
和Y
實例化爲值,您將獲得:
?- 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
由於統一X
與2
和Y
與1
和數字規則踢英寸
說了這麼多,如何在謂語使用@</2
select_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.
謝謝!好的回答:-) – parisa
有點晚了,但是這是一個錯字:'在這種情況下,X @
narn
@narn永遠不會太遲以修復一個錯字!感謝您找到它。 – lurker