序言中的顺序演算

时间:2019-03-02 03:48:46

标签: prolog logic runtime-error

我真的是Prolog中的新程序。我必须在Prolog中编写顺序演算规则,我认为我做对了。如果公式有效,则代码应返回true,否则无效。这是我的代码:

code as a picture

如果公式有效,则返回true。

但是,如果我使用无效的公式运行代码,它将永远不会结束,而且我真的不知道该如何解决。

查询-? sc([ ],[ (neg ((neg p)or neg (neg p)))]).应该返回false,因为该公式无效。

对此我将不胜感激。

2 个答案:

答案 0 :(得分:3)

析取规则中有错误。进一步 排列规则是结构规则:

G, A, B, D |- C
---------------
G, B, A, D |- C

您应该对其进行编码,以使其不会循环。但是现在这确实可以发生。有一个简单的技巧,也许您想实现它,只将非原子交换到最前端。

这是一个清理的版本:

:- use_module(library(basic/lists)).

sc([neg(A)|L],R) :- !, sc(L,[A|R]).
sc(L,[neg(A)|R]) :- !, sc([A|L],R).
sc(L,[or(A,B)|R]) :- !, sc(L,[A,B|R]).
sc([or(A,B)|L],R) :- !, sc([A|L],R), sc([B|L],R).
sc([A|L],R) :- atom(A), select(B,L,H), compound(B), !, sc([B,A|H],R).
sc(L,[A|R]) :- atom(A), select(B,R,H), compound(B), !, sc(L,[B,A|H]).
sc(L,R) :- member(A,L), member(A,R), !.

这是一些跑步:

Jekejeke Prolog 3, Runtime Library 1.3.5
(c) 1985-2019, XLOG Technologies GmbH, Switzerland

?- sc([],[neg(or(neg(p),neg(neg(p))))]).
No
?- sc([],[or(neg(p),neg(neg(p)))]).
Yes

备注:我已将身份规则移到末尾,因此它只会命中原子。我放置了裁减,对于某些经典逻辑,inversion lemmas证明了这一点。可能不适用于其他逻辑或出现非接地问题。

答案 1 :(得分:1)

:- use_module(library/basic/lists)).

sc(I,D) :- \+(intersection(I,D,[])),!.
sc([(neg F)|I],D) :- sc2(I,[F|D]),!.
sc(I,[(neg F)|D]) :- sc2([F|I],D),!.
sc(I,[(F1 or F2)|D]) :- union([F1,F2],D,D1),sc2(I,D1),!.
sc([(F1 or F2)|I],D) :- sc2([F1|I],D),sc2([F2|I],D),!.
sc2(I,D):-permutation(I,I1),permutation(D,D1),sc(I1,D1).