簡體   English   中英

Prolog成員/ 2謂詞

[英]Prolog member/2 predicate

為什么prolog回答錯誤: member([5], [2, 5]).

有辦法解決它嗎?

任何幫助將不勝感激。

為什么Prolog會回答: member([5], [2, 5]).

我們問Prolog為什么! library(diadem)下載到您的工作目錄中並:

?- use_module(diadem).
   true.

?- member([5], [2,5]).? Expl.
   Expl = member([_|_], [2, 5])
;  ...

它不僅失敗而且泛化失敗:而不是[5]這是一個包含單個元素5的列表,我們現在只需要至少一個元素 - 無論哪個。 因此我們可以將Expl的值作為仍然失敗的查詢。 因此,剩余目標中的某些東西必定是罪魁禍首。

?- member([_|_], [2, 5]).
   false.

還要注意沒有概括的內容:這兩個元素仍在這里! 如果它們是變量,查詢就會成功! 稍微概括一下查詢:

?- member([5], [2, Any]).
   Any = [5].

現在它成功了!

成員/ 2的SWI Prolog文檔中所述:

會員( ?Elem,? 列表

如果ElemList的成員,則為True。

謂詞是成員 它不是子集子列表 序列 如果第一個參數是第二個參數中給出的列表的成員(即元素 ),則成功。 元素[5]不在列表中的一員[2, 5]由於元件[5]不為2,它不是5。然而, [5]將是列表的成員[2, [5]] ,所以member([5], [2, [5]])會成功。

可能是你在尋找另一個謂詞?
來自子集/ 2的SWI Prolog文檔:

子集( + SubSet+ Set
如果SubSet的所有元素屬於Set則為 True。

它按預期工作:

Welcome to SWI-Prolog (threaded, 64 bits, version 7.5.5)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.

?- subset([5], [2, 5]).
true.

?- subset([5, 3], [2, 3, 5, 7]).
true.

?- subset([5, 3], [2, 5]).
false.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM