2016-10-12 12 views
0

在Prolog,給出事實的知識基礎:爲什麼在不同元素數量的事實之間的setof輸出有差異?

someFact(one). 
someFact(two). 
otherFact(one, two, 123, 456). 
otherFact(one, four, 789, 123). 

查詢setof(X, someFact(X), List).會產生這樣的結果:

List = [one, two] 

但是,查詢setof(X, otherFact(one, X,_,_), List產生這樣的:

List = [two] 

雖然我預計它會產生[two,four]。使用this源我發現打字;返回第一個列表時,會顯示所有其他選項:

List = [two] ; 
List = [four] . 

它爲什麼要這樣做呢?是因爲下劃線?我如何生成一個既有two也有four,而不需要按;? 我不知道如何找到答案,因爲我有麻煩將這個問題的措詞轉換成產生搜索結果的問題

+1

原則進行的拇指:'_'和'SETOF/3'不要扎堆。 – false

回答

2

您可以編寫: setof(X, B^A^otherFact(one, X,A,B), List)

查詢:

?- setof(X, B^A^otherFact(one, X,A,B), List). 
List = [four, two]. 

這是因爲,即使你在setof(X, B^A^otherFact(one, X,_,_)把 '_',SETOF/3旨在搜索所有自由變量。通過在前面放置B^A^,您可以選擇不綁定A或B,只搜索其他變量。

1

除了@編碼的回答,您可以編寫使用library(lambda)

?- setof(X, X+\otherFact(one,X,_,_), List). 
相關問題