2014-02-13 93 views
0

這很簡單,但似乎無法把握它,我有這些「顏色」簡單的Prolog SETOF

color(blue). 
color(red). 
color(white). 

使用setof 我需要得到這些顏色的所有可能的組合列表中的 這將是巨大的,如果你可以提供一個簡要的解釋。我想這個查詢

setof(X,color(X),Colors).這顯然

失敗

感謝

回答

2

我想你的意思是這與組合:

?- setof((X,Y), (color(X), color(Y)), ColorsCombined). 
ColorsCombined = [ (blue, blue), (blue, green), (blue, red), (green, blue), (green, green), (green, red), (red, blue), (red, green), (..., ...)]. 

還是你的意思了集?

subset([Element|Set], [Element|Subset]):- subset(Set, Subset). 
subset([_|Set], Subset):- subset(Set, Subset). 
subset([], []). 

superset(Set, Superset) :- setof(Subset, subset(Set, Subset), Superset). 

這是輸出:

?- superset([1,2,3], Superset). 
Superset = [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]. 
+0

謝謝,它基本上是我想要的!爲了進一步理解,我使用了這個查詢'setof((X,Y,Z),(color(X),color(Y),color(Z)),ColorsCombined)''。並得到了三個項目的圖案,但我想要列出一個列表。例如ColorsCombined = [(紅色,紅色,紅色),...]以及我想要的是ColorsCombined [[紅色,紅色,紅色],....]我需要更改什麼? – user3241846

+0

將括號從()更改爲[] – User

2

你的意思是這樣嗎?

all_permutations(Permutations) :- 

    % get all colors into a list 
    setof(Color, color(Color), One_Color_List), 

    % find all combinations using permutation/2 on One_Color_List 
    setof(Permutation, 
     permutation(One_Color_List, Permutation), 
     Permutations). 

結果:

?- all_permutations(X). 
X = [[blue, red, white], [blue, white, red], [red, blue, white], [red, white, blue], [white, blue, red], [white, red, blue]]. 

訣竅是讓事實轉化爲列表 - 像你一樣,然後用置換/ 2生成列表的所有排列。

如果這就是你想要的..不清楚...

+0

其實是我想要的,謝謝! – user3241846