我有一個prolog定義,返回多個答案。我想代替這個,返回一個包含所有可能答案的列表。如何在prolog中返回單個答案列表(而不是多個個人答案)?
E.g.
alpha;
beta;
gamma;
delta;
到
[alpha, beta, gamma, delta];
這怎麼能在序言辦呢?
我有一個prolog定義,返回多個答案。我想代替這個,返回一個包含所有可能答案的列表。如何在prolog中返回單個答案列表(而不是多個個人答案)?
E.g.
alpha;
beta;
gamma;
delta;
到
[alpha, beta, gamma, delta];
這怎麼能在序言辦呢?
請注意,根據您的具體需要,findall/3
可能不是一個適合:
考慮到與自由變量的L
成員結合E
謂詞test/2 : test(+L, -E)
:
test(L, E) :-
member(E, L),
var(E).
現在,讓我們說你想通過使用這個謂詞找到一個列表的所有自由變量(注意:如果你真的想這樣做,那不是正確的方式,它只是指出findall/3
行爲):
?- findall(X, test([A, 3, C], X), Xs).
Xs = [_G32, _G29].
findall/3
回答你一個很好的答案,但模數變量重命名!
?- bagof(X, test([A, 3, C], X), Xs).
Xs = [A, C].
或
?- setof(X, test([A, 3, C], X), Xs).
Xs = [A, C].
做的伎倆,雖然。
我不確定我在這裏說的是否適用於除SWI-Prolog之外的其他Prolog系統。
這裏是相應的doc page。
通過使用findall
。你有somepred(X)
,它給你你指定的答案。現在嘗試運行findall(X,somepred(X),List)
以查看List
與所有答案的列表進行統一。
編輯:使用setof
或bagof
代替findall
是錯誤的問題的背景下,作爲問道。
setof
顯然是錯誤的,因爲它跳過了碰巧是重複的有效解決方案。 bagof
失敗當沒有解決方案,而findall
正確「返回」空列表[]
(按OP所要求)。哦,既bagof
和setof
對自由變量替代綁定原路返回,而OP明確要求的解決方案的一個列表是「返回」,即沒有回溯。即:
?- [user].
|: test(L,E):- member(E,L),var(E).
|:
% user://2 compiled 0.00 sec, 124 bytes
Yes
?- findall(X, (test([A,3,A],X) , member(A,[1,2])) , Xs).
X = _G546
A = _G536
Xs = [1, 2, 1, 2] ;
No
?- bagof(X, (test([A,3,A],X) , member(A,[1,2])) , Xs).
X = _G534
A = 1
Xs = [1, 1] ;
X = _G534
A = 2
Xs = [2, 2] ;
No
?-
但OP要求要返回「包含所有可能的答案單一列表」。
編輯:沒有答案時的所有答案的列表是一個空的列表。
定義是什麼樣的? – geekosaur 2012-04-27 08:22:02