【问题标题】:Prolog - Predicate doesn't find all solutions when using no input variablesProlog - 不使用输入变量时,谓词找不到所有解决方案
【发布时间】:2019-03-09 17:39:25
【问题描述】:

这是我的问题。

我的事实和规则:

fact1(green, red, blue).
fact1(purple, white, gray).

fact2(green, orange).
fact2(purple, cyan).

fact3(green, pink).
fact3(purple, black).

foo(A,B,C,D,E) :-
   fact1(A,B,C),
   fact2(A,D),
   fact3(A,E),
   write(A),
   write(B).

现在如果我问 SWI-Prolog foo(A,B,C,D,E). 输出是

?- foo(A,B,C,D,E).
greenred
A = green, B = red, C = blue, D = orange, E = pink ;
purplewhite
A = purple, B = white, C = gray, D = cyan, E = black.

我的目标是用户只看到线条

greenred
purplewhite

为了实现这一点,我尝试像这样更改foo 的定义:

foo() :-
   fact1(A,B,C),
   fact2(A,D),
   fact3(A,E),
   write(A),
   write(B).

但是这个谓词的输出只有:

?- foo().
greenred
true.

不是我所期望的:

?- foo().
greenred
purplewhite
true.

非常欢迎任何帮助。

【问题讨论】:

  • 你是什么意思“但当然总是输出......”?你没有告诉我们你的事实是什么样的,所以我们不知道你的预期输出是什么。你真的有多个匹配的事实吗?你能包括一些我们可以重现的最小(虚拟)数据吗?我尝试了一些,但无法重现您的问题。所以要么问题出在你没有向我们展示的代码中,要么我不明白你的意思。你怎么运行这个?你在做什么来尝试获得多个匹配项?
  • 感谢您的回答,我用一些虚拟代码编辑了我的问题。希望现在你明白我的意思了。
  • 感谢您的更新。哦,是你有问题的true 输出吗?即使在 foo(). 上按空格键仍然会给我后续的比赛,但它也会在每次比赛后打印 true,而 foo(A,B,C,D,E). 不会这样做?
  • 我再次测试了它,我真的只得到了第一个与 foo() 匹配的结果,然后是真的,然后什么也没有。是的,正如你所说,我也没有得到真正的字里行间,如果可能的话,这也是我想要的。也许这是一个swi-prolog的东西?或者你知道我如何实现我想要的结果的另一种方法吗?
  • 好的,所以我使用 swish only 编辑器测试了我的代码,现在我得到了与 @mercator 相同的输出。有趣

标签: prolog


【解决方案1】:

在末尾添加fail/0 会将其转换为failure driven loop,这样一旦给出答案,谓词就会失败并尝试其他选择点。

foo :-
    fact1(A,B,_),
    fact2(A,_),
    fact3(A,_),
    write(A),
    write(B),
    nl,
    fail.

示例运行。

?- foo.
greenred
purplewhite
false.

为了让 Prolog 返回 true,(在后台一个邪恶的声音说,“我们有办法让你告诉我们真相”),它需要在失败后成功,所以 Prolog 寻找另一个名为 foo 的子句.通过只添加foo. 作为第二个子句,Prolog 现在可以找到该子句并执行它。由于它什么都不做,所以它成功并返回true.

foo.

示例运行

?- foo.
greenred
purplewhite
true.

完整的源代码

foo :-
    fact1(A,B,_),
    fact2(A,_),
    fact3(A,_),
    write(A),
    write(B),
    nl,
    fail.
foo.

【讨论】:

  • 术语:您的意思是说“子句”,而不是“谓词”。在“完整”代码中,您有 1 个谓词,其中包含 2 个子句(1 个规则和 1 个事实)。
  • 非常感谢!与 prolog 相比,SWISH 以不同的方式处理这一点非常有趣。这是我必须牢记的。
  • @repeat 谢谢。改变了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多