【问题标题】:prolog and translating propositional logic序言和翻译命题逻辑
【发布时间】:2013-08-21 16:53:37
【问题描述】:

我的最终目标是从文件中将一组命题公式加载到 Prolog 中,以推断出一些事实。假设我有命题公式:

p implies not(q).

在 Prolog 中这将是:

not(q) :- p

Prolog 似乎不喜欢规则头部的not 运算符。我收到以下错误:

 '$record_clause'/2: No permission to redefine built-in predicate `not/1'
        Use :- redefine_system_predicate(+Head) if redefinition is intended

我知道重写p implies q 的一般公式的两种方法。首先,利用对立式在逻辑上等价的事实。

p implies q iff not(q) implies not(p)

其次,利用p implies q在逻辑上等价于not(p) or q这一事实(真值表相同)。

第一种方法导致我当前的问题。第二种方法只是合取或析取。你不能在 Prolog 中只写连词和析取词,因为它们不是事实或规则。

  1. 解决我的问题的最佳方法是什么,以便我可以表达p implies not(q)
  2. 是否可以在 Prolog 中编写所有命题公式?

编辑:现在我希望将我的结果与其他命题公式联系起来。假设我有以下规则:

something :- formula(P, Q).

这是如何连接的?如果我在解释器中输入formula(false, true)(计算结果为真),这不会自动使something 为真。这就是我想要的。

【问题讨论】:

  • 您所要做的就是选择一个不同的名称。 not/1 是您的 Prolog 实现中内置的。

标签: prolog logic boolean-logic


【解决方案1】:
p => ~q  ===  ~p \/ ~q  === ~( p /\ q )

所以我们可以尝试使用 Prolog 程序对此进行建模,

formula(P,Q) :- P, Q, !, fail.
formula(_,_).

或者您可以使用内置的\+ 即“not”,将其定义为formula(P,Q) :- \+( (P, Q) ).

这只是检查传递的值是否符合公式。如果我们首先将其与域生成结合起来,我们可以“推断”,即生成合规值:

13 ?- member(Q,[true, false]), formula(true, Q).  %// true => ~Q, what is Q?
Q = false.

14 ?- member(Q,[true, false]), formula(false, Q). %// false => ~Q, what is Q?
Q = true ;
Q = false.

【讨论】:

  • 我几乎没有使用 prolog 的经验。使用member 有什么意义?我只是把公式写出来,通过真假。
  • 另外,我如何将逻辑与我的其他逻辑推论联系起来?如果公式为真,则假设其他东西为真。我们会有规则:something :- formula(P, Q)。我会在编辑中更清楚地说明这一点。
  • @CodeKingPlusPlus member 的要点是为变量生成可能的值。逻辑变量是什么变成真或假。 truefalse 在 Prolog 中不是布尔值;是特殊目标; true 总是成功,false(及其同义词,fail)总是失败。你应该学习一些教程来熟悉 Prolog。 :)
【解决方案2】:

您使用了错误的工具。尝试答案集编程。

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多