【问题标题】:Creating implications in Prolog, where A implies B and B implies A, through generic rules通过通用规则在 Prolog 中创建含义,其中 A 暗示 B,B 暗示 A
【发布时间】:2018-01-22 07:30:37
【问题描述】:

无火无烟,无烟无火。

用 Prolog 程序识别上述语句的结论和条件。在答案中,结论一定是有火就有烟,有烟就一定有火。

我该怎么做?

请解释答案。

【问题讨论】:

  • 改写:有火如果有烟。顺便说一句,你的问题的标题对我来说毫无意义。

标签: prolog artificial-intelligence discrete-mathematics first-order-logic


【解决方案1】:

两者都是可能的,因为有人可能会争辩说,没有火就不可能有烟,没有烟就不可能有火。

但是在没有关于火和烟的先验知识的情况下,你只能得出结论,只有在有火的情况下才会有烟。所以烟雾是条件,因为“如果你看到烟雾(条件)”你“知道有火(结论)”。但是,如果您知道有火,则仅给出这句话,您不能确定有烟。

【讨论】:

  • 两者都是可能的,因为有人可能会争辩说,没有火就不可能有烟,没有烟就不可能有火。 是的,实际上,没有火就可以有烟。事实上很常见。
  • 是的,但这不是物理任务,而是逻辑。因此,为了简化问题,人们可以这样争论。但这实际上不是重点,因为机器没有人类的常识可以争论。它遵循给定的规则。所以只有smoke=condition 和fire=conclusion 在这种情况下是真的
【解决方案2】:

我假设这个问题是关于如何根据有关某些原子的其他已知事实来创建暗示事实为真的合理规则。如果位置“a”在冒烟,则位置“a”一定有火,因此“a”有火。

smoke(a).
smoke(b).
fire(c).

fire(X) :- smoke(X).
smoke(X) :- fire(X).

?- fire(a).
true

?- fire(b).
true

?- fire(c).
true

?- smoke(c).
true

如果您想专门检查某物是否着火或冒烟:

isFire(X) :- fire(X);smoke(X).
isSmoke(X) :- smoke(X);fire(X).

例子:

?- isFire(asbestos), smoke(asbestos).
false <- the first statement is never true so the second never gets called

; 符号表示 OR,因此如果给定事实的火或烟为真,它将返回真。

【讨论】:

  • 你能查询你的程序终止吗?例如。我想在拨打fire(asbestos) 时收到false.。但查询 fire(a) 也需要中止,通过输入 ; 枚举解决方案将重复 true 而不会结束。
  • @lambda.xy.x 该程序假设您询问的是已知事实,所以如果您询问的是火灾或烟雾,并且没有事实?无限递归。您可以编写不相互暗示的单独谓词,以允许您检查相同但具有未知数的事物。 isFire(X) :- fire(X);smoke(X). isSmoke(X) :- smoke(X);fire(X).
猜你喜欢
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2012-12-29
相关资源
最近更新 更多