使用!
和fail
,我試圖否定失敗。序言 - 這種否定是否正確?
然而,下面的方法給了我警告:Singleton變量:[X]。
但是,它似乎工作,所以我想知道如果有什麼不對我做這件事的方法:
likes(vincent, big_kahuna_burger).
neg(X) :- X, !, fail.
neg(X).
所以調用neg(likes(vincent, big_kahuna_burger))
將返回false
。
使用!
和fail
,我試圖否定失敗。序言 - 這種否定是否正確?
然而,下面的方法給了我警告:Singleton變量:[X]。
但是,它似乎工作,所以我想知道如果有什麼不對我做這件事的方法:
likes(vincent, big_kahuna_burger).
neg(X) :- X, !, fail.
neg(X).
所以調用neg(likes(vincent, big_kahuna_burger))
將返回false
。
您的實施neg
是正確的。它只是給你一個警告,因爲在第二條規則中,從不使用X
。如果你寫
neg(X) :- X, !, fail.
neg(_).
你將不會收到警告。
爲了擴大這個問題:你可以命名你的變量,至少在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
是相同的變量。