统一序言中的目标列表
Unifying a list of goals in prolog
我有一个目标列表,我希望在运行时统一这些目标,以便我得到一个变量、值对列表。我该怎么做?
示例
db.pl:
alpha(a).
bravo(b).
bravo(c).
gs([alpha(X), bravo(Y)]).
口译员:
?- [db].
?- gs(L), solve(L, Out).
L = [alpha(X), bravo(Y)].
Out = [[[X, a], [Y, b]], [[X, a], [Y, c]]]
(给你看这个我觉得很不好意思,我很确定你还是误解了一些地方。事实上,你学习setof/3
和[=13=会更好]。但是,我们要做什么才能赢得代表...)
solve(L, Out) :-
setof(Pairs, maplist(goal_pair,L,Pairs), Out).
goal_pair(G, [V,W]) :-
arg(1, G, V),
setof(V, G, Vs),
member(W, Vs).
这会给你 SWI
?- gs(L), solve(L, Out).
L = [alpha(_G1760), bravo(_G1765)],
Out = [[[_G1760, a], [_G1765, b]], [[_G1760, a], [_G1765, c]]].
无法直接恢复变量名。您将不得不自己解析程序。
我有一个目标列表,我希望在运行时统一这些目标,以便我得到一个变量、值对列表。我该怎么做?
示例
db.pl:
alpha(a).
bravo(b).
bravo(c).
gs([alpha(X), bravo(Y)]).
口译员:
?- [db].
?- gs(L), solve(L, Out).
L = [alpha(X), bravo(Y)].
Out = [[[X, a], [Y, b]], [[X, a], [Y, c]]]
(给你看这个我觉得很不好意思,我很确定你还是误解了一些地方。事实上,你学习setof/3
和[=13=会更好]。但是,我们要做什么才能赢得代表...)
solve(L, Out) :-
setof(Pairs, maplist(goal_pair,L,Pairs), Out).
goal_pair(G, [V,W]) :-
arg(1, G, V),
setof(V, G, Vs),
member(W, Vs).
这会给你 SWI
?- gs(L), solve(L, Out).
L = [alpha(_G1760), bravo(_G1765)],
Out = [[[_G1760, a], [_G1765, b]], [[_G1760, a], [_G1765, c]]].
无法直接恢复变量名。您将不得不自己解析程序。