2009-12-10 67 views
1

我想知道,我將如何使用下劃線兩次,但檢查該下劃線的兩個實例統一?序言通配符

我基本上需要的是什麼,如果存在一個映射值相同的兩個元素,則返回true ...

member((_,_),[(a,a),(b,a),(c,a)]).

如果我使用一個變量不使他們統一?

member((A,A),[(a,a),(b,a),(c,a)]).

但它返回的變量,而不是真實的。

我需要一些啓發。

+0

下劃線不是通配符。它被用來表明你根本不在乎它需要什麼價值。從約束滿足的角度來看,你根本沒有對這個變量加以限制。這意味着兩個不同的下劃線可以採取不同的值。你可以很容易地檢查:'? - member((,),[(b,c)])。 >> true.' – nedned 2009-12-11 00:21:31

回答

5

你的解決方案是一個變量是正確的。

返回變量是一種返回true的方法。這真的意味着:當var =值這個目標是真實的,而不是這個目標是真實的

注意,使用本作中不同謂語從句,將隱藏變量:

contains_identical_pair(List) :- member((A,A),List). 
2

您可以使用雙重否定,以避免變量綁定:

?- \+ \+ member((A,A),[(a,a),(b,a),(c,a)]). 
true. 
+0

這很漂亮;) – sharky 2009-12-11 06:25:16

2

的裝幀印刷變量在prolog屏幕上就可以在交互式提示中讓生活更輕鬆,這樣您就不必每次都打印出您關心的變量。它們完全不影響你的代碼的邏輯。

它們只會在變量提示時輸入。因此,如果您正在編寫的謂詞是較大程序的一部分,那麼您可以忽略此輸出,或者如果您希望它成爲人們從提示中調用並且不希望打印輸出的頂級謂詞,那麼只需將你的調用包裝在一個沒有參數或只有輸入參數的謂詞中。即:

wrapper :- 
    predicate(Out1,Out2). 

或:

wrapper(In1,In2) :- 
    predicate(In1,In2,Out1,Out2).