Мне нужно оценить логические выражения в дизъюнктивной нормальной форме DNF и определить, являются ли они истинными или нет.
Первым шагом было превращение любого утверждения в DNF, которое я уже понял. Но после этого я должен оценить результат этого изменения и выяснить, истинно оно или нет (1 или 0).
Часть DNF, которую я сделал, такова:
:- 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)).
И, если предположить, что список
M([a,b,c]).
Выход будет истинным