prolog中的序列演算

prolog中的序列演算,prolog,logic,runtime-error,Prolog,Logic,Runtime Error,我对Prolog编程非常熟悉。我必须用Prolog编写顺序演算的规则,我认为我做得对。如果公式有效,代码应返回true;如果公式无效,代码应返回false。这是我的密码: 如果公式有效,则返回true 但是如果我用一个无效的公式运行代码,它永远不会结束,我真的不知道如何修复它 查询-?sc[],[neg neg por neg neg p]。应返回false,因为该公式无效 我将非常感谢您的帮助。析取规则中有一个错误。进一步 排列规则是一种结构规则: G, A, B, D |- C ------

我对Prolog编程非常熟悉。我必须用Prolog编写顺序演算的规则,我认为我做得对。如果公式有效,代码应返回true;如果公式无效,代码应返回false。这是我的密码:

如果公式有效,则返回true

但是如果我用一个无效的公式运行代码,它永远不会结束,我真的不知道如何修复它

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


我将非常感谢您的帮助。

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

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

备注:我已将标识规则移到末尾,因此它只会命中原子。我已经把削减,这是有理由的一些古典逻辑。可能不适用于其他逻辑或出现非接地问题。

请不要将代码作为图像发布。将其作为文本发布,以便我们可以使用它。大多数用户不会尝试在没有代码作为文本的情况下回答问题。很抱歉,我将在以后以文本形式发布它。这是否意味着您将编辑此问题?请显示您运行的查询和预期结果。请编辑您的问题并将代码的实际文本放在那里。全部选中并单击{}按钮以正确设置格式。你知道[neg neg por neg neg p]是一个元素列表吗?哦,谢谢。我刚刚用另一种不同的方式使用排列对我的代码进行了另一种更正,它很有效。我刚刚发布了我的新代码。是否总是有必要结束身份规则@j4n Burn53不,我想你也可以允许规则G,a |-a,D,而不仅仅是G,P |-P,D。至少在经典逻辑中,我想你可以证明前者也是可导的。我刚才看到,你的恒等式规则是正确的。假设交集/3谓词足够稳定,可以这样调用。所以我编辑了我的帖子,身份规则中没有错误。你是否再次尝试了sc[],[negornegp,negornegp]?
:- 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).