【问题标题】:Prolog Queries is returning wrong boolean valueProlog 查询返回错误的布尔值
【发布时间】:2018-03-14 03:17:43
【问题描述】:

所以我有一个事实weather(jan, 17, cold, wind, snow). 和规则

match(W,D,T) :-
      weather(W,D,T,_,_)
  ;   weather(W,D,_,T,_)
  ;   weather(W,D,_,_,T).

当我输入match(jan, 17, wind). Prolog 返回true; false. 我希望它只返回true,但它也返回false,我该如何解决这个问题?

【问题讨论】:

  • 您对weather/5 的定义有一些内在的歧义,因为第 3、第 4 和第 5 个参数可以互换地表示任何含义。因此,如果您尝试编写一个适当的通用谓词,如match/3,它将有选择点。当您看到 true 作为提示时,这意味着 Prolog 成功,但有一个选择点需要返回以检查另一个可能的解决方案(因为,如果它在数据库中,weather(jan, 17, wind, snow, cold) 也可能是有效的匹配的事实)。当 Prolog 找不到更多解决方案时,它最终会给出false。正常。
  • 您可以像@Zebollo 建议的那样使用剪切,这会修剪选择点,但是您会失去解决方案的一般性。对于合法具有多个解决方案的查询,它不会产生多个结果。

标签: prolog prolog-toplevel


【解决方案1】:

我不鼓励使用“;” (OR) 运算符(不可读的代码)。 这是你应该写的:

match(W,D,T) :-
    weather(W,D,T,_,_),
    !.
match(W,D,T) :-
    weather(W,D,_,T,_),
    !.
match(W,D,T) :-
    weather(W,D,_,_,T).

由于回溯,您之前的代码“返回”真假。这没有什么不妥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多