[英]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,? 列表 )
如果
Elem
是List
的成員,則為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.