0
?- assert(p(a)),assert(p(b)),setof(X,p(X),R).
X = H142
R = [a, b]
yes
這個查詢的效果是什麼,它爲什麼返回這個特定的結果?Prolog爲什麼這個查詢返回這個特定的結果,它的作用是什麼
?- assert(p(a)),assert(p(b)),setof(X,p(X),R).
X = H142
R = [a, b]
yes
這個查詢的效果是什麼,它爲什麼返回這個特定的結果?Prolog爲什麼這個查詢返回這個特定的結果,它的作用是什麼
yes
結果的原因是R,即僅由a和b構成的集合實際上是滿足p(x)謂詞的所有X的集合。
如果要向R中添加元素或從中刪除a或b,結果將爲no
。
p(a)和p(b)爲真,因爲斷言謂詞將這些子句添加到數據庫中。
同樣,保持R = [a, b]
如果你增加一個條款,與說assert(p(c))
,其結果必然是no
(因爲R.將缺少C到有所有 X滿足P(X))。
請注意,在調用setof/3後'X'仍然沒有綁定,因爲'X'是一個「虛擬變量」,用於告訴Prolog目標'p(X)'的什麼解決方案將被收集到列表中'R'。當目標中出現不止一個變量時,'setof/3'還允許使用更復雜的語法,因此某些變量的值可以作爲複合項組合在列表中,其他變量的值可以在回溯中綁定或修改。 – hardmath