[英]How to define a rule to require all in Prolog?
擁有知識庫:
must_have(user, car, blue).
must_have(user, car, yellow).
must_have(user, bike, green).
如何定義:
is_a_collector(X):-must_have(X, car, blue),
must_have(X,car,yellow),
must_have(X,bike,green).
沒有說明所有條件?
我這樣說是因為知識領域很大,我想定義一個捕獲許多條件的規則。
我正在使用Swi-Prolog。
對於SWI-Prolog,您可以使用library(aggregate)
foreach/2
library(aggregate)
。 閱讀有關它究竟是什么的文檔,但實際上,它會創建您需要的連接。
?- foreach(must_have(X, _, _), X = user).
true.
?- foreach(must_have(X, _, _), X = foo).
false.
或者,如果要定義謂詞,
is_a_collector(X) :- foreach(must_have(Y, _, _), Y = X).
但是,@ lurker是對的,你的問題有點不清楚。 建議的解決方案也感覺有些奇怪。 至少,如果您希望能夠聲明任何不返回真理的查詢,那么您的數據庫應該包含其他表。 目前,上面的第一個查詢詢問:
“每個must_have/3
事實都有user
作為它的第一個參數嗎?”
為此,您可以直接使用forall/2
,因為您不需要連接。
那你對這個問題的答案是什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.