我想做的事情是生成給定列表中元素的所有組合。例如:從[a,b,c],我可能想要:如何使用clp(fd)綁定所有組合序言搜索?
[]
[a]
[b]
[c]
[a,a]
[a,b]
[a,c]
[b,a]
...
依此類推。也許這是一個神奇的序言。如果是這樣,我很樂意聽到它。
但是,我的問題不在於解決這個特定的問題,而在於更多的人請求解釋Prolog的搜索算法的一些微妙之處。
所以在這裏我就是這樣做首先要解決上述問題:
members([], _).
members([X|Xs], List) :-
member(X,List),
members(Xs, List).
這個偉大的工程,但返回的所有可能的結果,而不是在一個偉大的順序:
[]
[a]
[a,a]
[a,a,a]
好了,這是沒有問題。我真的只想要所有組合達到一定的長度。所以我決定首先得到具有特定長度的那些:
membersWithLength(Members, List, Bound) :-
L = Bound,
length(Members, L), members(Members, List).
這很好,例如,長度爲2:
[a,a]
[a,b]
[a,c]
...
等等。現在我嘗試使用clpfd利用上述函數來獲取所有列表達到一定長度偏差去:
:- use_module(library(clpfd)).
membersLessThan(Members, List, Bound) :-
L in 0..Bound, % I also tried L #=< Bound
membersWithLength(Members, List, L).
類作品。找到正確的結果(長度小於Bound的列表)。 但找到它們後,它會不斷搜索更多結果。例如。對於長度爲2:
[]
[a]
[b]
[c]
[a,a]
[a,b]
...
[c,c]
Hangs looking for more solutions.
我想這是我的問題的核心。有人可以解釋爲什麼(根據痕跡)prolog繼續檢查越來越大的列表作爲可能的解決方案,即使它們都註定要失敗嗎?有人能告訴我是否有辦法幫助序言避免這個註定的旅程?
我最終使用下面的代碼來解決問題,但我很失望,我不知道如何使用clpfd的整數約束來約束列表的大小。
membersLessThan_(Members, List, Bound) :-
numlist(0,Bound,ZeroToBound),
member(L, ZeroToBound),
membersWithLength(Members, List, L).
這裏是SWISH所有相關代碼:http://swish.swi-prolog.org/p/allcombos.pl
不幸的是,clpfd和術語並沒有融合在一起。 – false
請參閱http://stackoverflow.com/questions/32478193/using-a-constrained-variable-with-length-2/32501766 – jschimpf
我想你可能是對的@false。你能否指點我一些資源來描述這樣的事情:1)爲什麼他們沒有成功,2)他們在什麼情況下做或不做,或者3)當他們沒有時,一些典型的應對策略可能是什麼?或者,如果你恰好掌握了這些概念,我會很感激你能否向我解釋。 –