序言:以析取范式评估命题逻辑陈述

时间:2019-10-29 18:32:22

标签: list prolog logic model-checking propositional-calculus

我需要以析取范式DNF评估逻辑语句并确定它们是否正确。

第一步是将我已经弄清楚的所有语句转换为DNF。但是之后,我必须评估该更改的结果,并确定更改是否正确(1或0)。

我制作的DNF部分是这样的:

package.json

现在,对于下一部分,我不确定如何进行。 我当时以为我可以使用列表来定义要使用的变量,并且由于所有语句仅由析取和取反构成,因此我只需要定义这两个操作即可。然后我必须检查原子是否在列表中

:- op(50, fx, neg).
:- op(400, yfx, or).
:- op(500, yfx, and).
:- op(100, yfx, iff).
:- op(200, yfx, imp).

dnf(X, X):- atomic(X).
dnf(neg X, neg X1):-
    dnf(X, X1).
dnf(X and Y, neg(neg(X1) or neg(Y1))):-
    dnf(X, X1),
    dnf(Y, Y1).
dnf(X iff Y, neg(neg(neg X1 or Y1) or neg(neg Y1 or X1))):-
    dnf(X, X1),
    dnf(Y, Y1).
dnf(X imp Y, neg(X1) or neg(Y1)):-
    dnf(X, X1),
    dnf(Y, Y1).
dnf(X or Y, X1 or Y1):-
    dnf(X, X1),
    dnf(Y, Y1).

但这会发送错误。

输入示例为

M([a,b,c]).
mc(F,M):-
    dnf(F, F1),
    mc(F1, M).
mc(F, M):-
    atomic(F),
    member(F,M).
mc(neg F, M):-
    not(mc(F, M)).
mc(F or _, M):-
    mc(F, M).
mc(_ or G, M):-
    mc(G, M).

而且,假设列表为

mc(neg(a and d)).

输出是正确的

0 个答案:

没有答案