我的最终目标是从文件中将一组命题公式加载到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中写出连词和断言,因为它们不是事实或规则。
p implies not(q)
?编辑:现在,我希望将结果与其他命题公式联系起来。假设我有以下规则:
something :- formula(P, Q).
这是如何连接的?如果我将formula(false, true)
(计算结果为true)输入解释器,则不会自动使something
成立。这就是我想要的。
答案 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)
您使用的是错误的工具。尝试答案集编程。