【问题标题】:Prolog Output Gives False After TrueProlog 输出在 True 后给出 False
【发布时间】:2018-12-23 07:59:55
【问题描述】:

我有一个序言程序来表示两个州之间的航班及其成本。

我的程序是这样的:

flight(newyork,washington,7). %its mean that there is a flight between both washington and newyork, newyork and washington with cost 7. 
flight(lasvegas,losangeles,4).
flight(california,arizona,8).

route(A,B,C):-
    flight(A,B,C);flight(B,A,C). %there is a route if there is a flight between A and B with cost C `OR` B and A with cost C.

现在,当我编写这样的查询时:

?-route(washington,newyork,7).

它给我true。这个查询对我很有用。

但是当我写这个查询时:

?-route(newyork,washington,7).

它首先给了我truefalse 之后。但我不想要这个。我只想要true,为什么它在true 之后给出false?为什么它给出两个输出?

【问题讨论】:

    标签: prolog prolog-toplevel


    【解决方案1】:

    您对route/2 谓词的定义不是确定性的。如果分离中的左目标成功了,那么右目标也有可能成功。 IE。析取意味着一个选择点:

    ?- route(newyork,washington,7).
    true ;
    false.
    

    当您键入; 时,您是在向 Prolog 寻求替代解决方案。 Prolog 引擎回溯到选择点并尝试正确的目标。由于此目标失败,Prolog 顶级打印 false 让您知道无法找到替代解决方案。

    【讨论】:

    • 只有true 而不是truefalse 我该怎么办?
    【解决方案2】:

    它首先给了我true,然后是false。但我不想要这个。我只想要true,为什么它在true 之后给出false?为什么它给出两个输出?

    因为 Prolog 有内置的回溯。在提出第一个解决方案后,它会报告该解决方案,但随后会回溯以寻找另一个解决方案。

    根据确切的查询,Prolog 可以提前知道没有回溯选项。 Prolog 自上而下地评估谓词的事实/子句,这意味着如果它例如在最后一个子句上成功(并且没有递归调用),它肯定知道它已经彻底搜索了所有选项。

    你在这里写:

    route(A, B, C):-
        flight(A, B, C);
        flight(B, A, C).

    所以这意味着如果你调用route(newyork, washington, 7).,它会首先调用flight(newyork, washington, 7)。并且成功(它甚至是第一个flight/3 事实),但仍有选择如何成功:也许还有另一个flight(newyork, washington, 7) 事实上,所以这可以给true 第二次。

    然而,大多数 Prolog 系统都有高级查找策略,以查看这是唯一的 flight/3 事实,newyork 作为第一个参数,因此现代 Prolog 系统通常会提前知道没有希望找到另一个 @ 987654335@ 事实上,但这并不意味着我们已经完成了。

    您在 route/3 子句 flight(B, A, C) 的主体中定义了,因此 Prolog 将开始搜索 flight/3,但位置已交换。因此,它会在报告第一个解决方案后,继续查询,并致电flight(washington, newyork, 7),希望找到另一个解决方案。

    如果查询使用变量,这非常有用,因为在建议的解决方案中,分配给变量的值可以(并且经常)不同,因此可以使用作为搜索工具。

    您可以使用once/1 [swi-doc] 元谓词来评估一次调用。在这种情况下,谓词要么成功(并统一变量),要么不成功(并且失败)。此外,谓词当然仍有可能引发错误,或者陷入无限循环。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2016-11-25
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      相关资源
      最近更新 更多