Пролог: оценивать высказывание логики высказываний в дизъюнктивной нормальной форме - PullRequest
0 голосов
/ 29 октября 2019

Мне нужно оценить логические выражения в дизъюнктивной нормальной форме 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]).

Выход будет истинным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...