我有两个谓词:
foo(Y,X)
bar(Y,Z)
运行foo后,如何运行具有Y的所有可能性的条形码?
示例:
foo(Y, key) % all possibilities of Y => chat
% faq
% about
% search
如何以这些可能性运行吧?
bar(chat, Z)
bar(faq, Z)
bar(about, Z)
bar(serach, Z)
然后将Z
的所有结果存储在列表Zs
?
答案 0 :(得分:2)
foo / 2和bar / 2已经在 join 中,并且每次运行foo / 2 bar / 2后都会尝试。
也许你正在寻找forall(foo(Y,X), bar(Y,Z))
,运行所有 foo / 2,和然后bar / 2的可能性。即要求bar / 2不会失败。
要理解forall / 2的行为,以及其他所有解决方案内置函数,如setof / 3,可以使用非常简单的内置函数进行有用的测试,具有众所周知的行为:
?- forall(member(X,[f,o,o]),(member(Y,[b,a,r]),writeln(X-Y))).
f-b
o-b
o-b
true.
你可以看到forall的完整解决方案搜索适用于它的第一个参数,而不是第二个参数。
HTH
答案 1 :(得分:0)
我想你想要这样的东西:
barOnList([], []).
barOnList([Y|Ys], [Z|Zs]) :- bar(Y, Z), barOnList(Ys, Zs).
答案 2 :(得分:0)
allZs(X, Zs) :-
setof(Y, foo(Y, X), Ys),
maplist(bar, Ys, Zs).
相关的SWI-Prolog手册页:Finding all Solutions to a Goal和library apply
注意:通常在Prolog中,约定是将输出参数放在输出参数之前 - 在第一个谓词中表示foo(X, Y)
而不是foo(Y, X)
。此外,它还概述了传递性:foo(X, Y), bar(Y, Z).
。