prolog和翻译命题逻辑

时间:2013-08-19 19:22:37

标签: prolog logic boolean-logic

我的最终目标是从文件中将一组命题公式加载到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中编写所有命题公式?
  3. 编辑:现在,我希望将结果与其他命题公式联系起来。假设我有以下规则:

    something :- formula(P, Q).

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

2 个答案:

答案 0 :(得分:3)

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.

答案 1 :(得分:-2)

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