2012-03-06 131 views
1

使用!fail,我試圖否定失敗。序言 - 這種否定是否正確?

然而,下面的方法給了我警告:Singleton變量:[X]。

但是,它似乎工作,所以我想知道如果有什麼不對我做這件事的方法:

likes(vincent, big_kahuna_burger). 
neg(X) :- X, !, fail. 
neg(X). 

所以調用neg(likes(vincent, big_kahuna_burger))將返回false

回答

2

您的實施neg是正確的。它只是給你一個警告,因爲在第二條規則中,從不使用X。如果你寫

neg(X) :- X, !, fail. 
neg(_). 

你將不會收到警告。

1

爲了擴大這個問題:你可以命名你的變量,至少在swi中,首先用_來表示它們不會被多次使用。這樣,您仍然可以爲變量添加一個有意義的名稱並保留有價值的信息。下面是member/2一個例子:

member(Element, [Element|Tail]). 
member(Element, [Head|Tail]) :- 
    member(Element, Tail). 

會產生警告,但

member(Element, [Element|_Tail]). 
member(Element, [_Head|Tail]) :- 
    member(Element, Tail). 

不會,但你已經保存包含在你的變量的名稱的所有信息。

雖然,你必須要注意,一個變量開始與_是不一樣的東西,匿名變量,例如,在該代碼(這是有點沒用的):

member(_, _). 

兩個_是不同的變量,而在這樣的代碼:

member(_A, _A). 

兩個_A是相同的變量。