运行功能,其他功能导致所有可能性

时间:2012-06-01 05:17:00

标签: prolog prolog-setof

我有两个谓词:

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

3 个答案:

答案 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 Goallibrary apply

注意:通常在Prolog中,约定是将输出参数放在输出参数之前 - 在第一个谓词中表示foo(X, Y)而不是foo(Y, X)。此外,它还概述了传递性:foo(X, Y), bar(Y, Z).

相关问题