2014-01-05 175 views
1

當您調用member(Item, List)時帶有一個不合乎規格的列表,Prolog統一併返回一個包含項目的列表。我想要一條規則返回true/false並且不會嘗試統一。有這樣的規則嗎?成員謂詞

回答

1

我會用一個後衛,像

is_member(E, L) :- nonvar(L), memberchk(E, L). 

memberchk/2它使用會員/ 2,確定性版本發現如果列表中包含至少1次出現的元素。不能作爲生成器,但效率更高。無論如何,守衛是必需的。

+0

根據OP,'is_member(E,L)'應該是true,但是你的定義失敗。 – false

+0

@false:好吧,您必須在OP問題中閱讀*非常*不同於我的內容。 – CapelliC

+0

我讀到OP的問題,因爲如果給定一個實例化的'E'並且沒有實例化的'L',想要一個返回false的謂詞,它會失敗而不是返回包含'E'的'L'中的列表。然而,看起來他們接受了這個答案,所以也許他們沒有精確地指出他們的問題。 – lurker

3

快速回復:使用\+ \+ member(Item, List)

請注意,當您的程序代表邏輯關係時,這樣的測試通常沒有多大意義。

您聲明member(Item, List)「返回一個列表」。那麼這並不完全正確。 List部分列表統一,即List = [Item|_Rest] ; List = [_,Item|_Rest] ; ..._Rest是一個未被證實的變量。也就是說,目標member(Item, List)不保證(成功後)List是一個列表。這是一個反例:member(Item, List), List = [_|nonlist]

+0

謝謝! \ +是什麼意思? – saadtaame

+0

@saadtaame:'(\ +)/ 1' - 不可證明 – false