【问题标题】:run function with all possibilities resulted from other function运行函数,所有可能性都来自其他函数
【发布时间】:2012-06-01 05:17:00
【问题描述】:

我有两个谓词:

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

【问题讨论】:

  • 你可以将Y的所有可能值放在一个列表中,然后相应地编写谓词bar
  • @FlopCoder 你能提供一个示例代码吗?

标签: prolog prolog-setof


【解决方案1】:

foo/2 和 bar/2 已经在 join 中,每次运行 foo/2 之后都会尝试 bar/2。

也许您正在寻找 forall(foo(Y,X), bar(Y,Z)),它运行 所有 foo/2、然后是 bar/2 的可能性。 IE。要求 bar/2 不会失败。

要了解 forall/2 以及其他 all 解决方案 内置函数(如 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

【讨论】:

    【解决方案2】:
    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).

    【讨论】:

    • 实际上,我已经使用 foo 存储了无向图。例如: foo (x,y) 表示 x 和 y 相互连接。我正在寻找从 y 的邻居到目标的方法。出于这个原因,我写了 foo (Y,X )。
    • 嗯,是的,这是一个旁注,恰好相反的顺序是合理的。
    【解决方案3】:

    我想你想要这样的东西:

    barOnList([], []).
    barOnList([Y|Ys], [Z|Zs]) :- bar(Y, Z), barOnList(Ys, Zs).
    

    【讨论】:

    • maplist/3 也可以解决问题,如果您使用的实现中没有提供它,那么这里会在 SO 上提出几个。
    • 但是,foo 并没有返回一个列表。它只返回一个值。例如: foo(Y,key) 返回聊天然后我按 a 显示所有可能性。之后,faq、about、search 也会在终端中看到。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多