2

我有两个谓词:

foo(Y,X)
bar(Y,Z)

运行 foo 后,如何在 Y 的所有可能性下运行 bar?

例子:

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

4

3 回答 3

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 的完整解决方案搜索适用于它的第一个参数,而不是第二个参数。

高温高压

于 2012-06-01T09:26:49.520 回答
0

我想你想要这样的东西:

barOnList([], []).
barOnList([Y|Ys], [Z|Zs]) :- bar(Y, Z), barOnList(Ys, Zs).
于 2012-06-01T06:32:00.773 回答
0
allZs(X, Zs) :-
    setof(Y, foo(Y, X), Ys),
    maplist(bar, Ys, Zs).

相关的 SWI-Prolog 手册页:Finding all Solutions to a Goal and library apply

注意:通常在 Prolog 中,约定是将输入参数放在输出参数之前 - 在你的第一个谓词中,这意味着foo(X, Y)而不是foo(Y, X). 加上这里它概述了传递性:foo(X, Y), bar(Y, Z)..

于 2012-06-01T08:53:18.653 回答