我需要以析取范式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)).
输出是正确的