2011-06-10 40 views
2

bagof/3據我理解謂詞SETOF/3和bagof/3可用於產生一個問題的解決方案的列表。 (Link to gprolog manual)問題的Prolog中

正如預期的那樣,以下面的查詢的解決方案是a,b和c。

?- nth(_, [a,b,c], X).     
X = a ? ; 
X = b ? ; 
X = c ? ; 
yes 

現在我試試這個:

?- setof(X, nth(_, [a,b,c], X), ListOfSolutions). 
ListOfSolutions = [a] ? ; 
ListOfSolutions = [b] ? ; 
ListOfSolutions = [c] 
yes 

的解決方案應該是[A,B,C]在我看來。我究竟做錯了什麼?

我使用gprolog 1.4.0適用於Mac OS。


編輯:解

我真正需要的是(^)/ 2的操作者,但是這裏給出的答案是完全正確的,非常感謝你的幫助。如果任何人有類似的問題,這裏是我目前的代碼來從三維網格中選擇單元格。

% selectFLR(?Grid, ?ClassId, ?TDayIdD, ?HourId, -ListOfFLR) 
% --------------------------------------------------------- 
selectFLR(Grid, ClassId, DayId, HourId, ListOfFLR) :- 
    bagof(FLR, ClassId^DayId^HourId^selectSingleFLR(Grid, ClassId, DayId, HourId, FLR), ListOfFLR). 

selectSingleFLR(Grid, ClassId, DayId, HourId, FLR) :- 
    nth(ClassId, Grid, Class), 
    nth(DayId, Class, Day), 
    nth(HourId, Day, FLR). 

回答

2

不,它不應該。 nth(_,[a,b,c],X)每次給出X的1個解。 SETOF(和bagof)工作,如:

setof(Things, GoalCondition, Bag) 

如果指定的東西作爲X,從第n/3的X是(因爲你在上面的例子中顯示)只是一個單一的變量每次SETOF只會創建該單個變量的列表。其他可能的統一將是可能的,但它會每次都會製作一件東西在物品中。

Formal:謂詞bagof和setof yield集合,用於目標中自由變量的單個綁定。 setof產生的集合的排序版本沒有重複...找到所有自由變量自動存在量化的bagof行爲。另外findall返回一個空列表[]沒有目標滿意度,而bagof失敗。

爲了使長話短說:使用的findall:P

+1

,因爲它產生時,它發現一個匿名的一個新的變量,我不能使用的findall/3。我想對它們應用一些有限的域約束,所以這對我來說是一個問題。有沒有一種方法可以使用bagof來生成一系列解決方案? – Thomas 2011-06-11 14:20:16

1

試着寫這樣的:

findall((A,B,C,D,E), coursemeetings(A,B,C,D,E),L)