Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

Изменение исходной булевой функции по правилу де Моргана в Prolog

Доброго дня. Мне нужно написать программу на прологе, которая меняла бы участки выражения на эквивалентные по правилу де Моргана. Сложность в том, что программа получает в качестве аргумента темр состоящий из функторов, которые в свою очередь содержат еще функторы. Т.е. выражение вида ~(A v B) & (~(A & C) v D & B) подается в программу как &(~(v(A,B)),v(~(&(A,C)),&(D,B))). Однако у меня не выходит получить результат.
transform( ~ (XX & YY), ~XX v ~YY). transform( ~ (XX v YY), ~XX & ~YY).
exp_transform(Term, Result_Term):- var(Term), var(Result_Term).
exp_transform(Term, Result_Term):- arg(_, Term, Value_Basic), arg(_, Result_Term, Value_of_ResTerm), exp_transform(Value_Basic, Value_of_ResTerm).
exp_transform(Term, Result_Term):- transform(Term, Result_Term), exp_transform(Term, Result_Term).
Перебирал различные варианты. Можете подсказать в чем заключается проблема? Как подавать и обрабатывать выражение?


Ответ

Как подавать и обрабатывать выражение?
Я, пожалуй, упроcтил бы синтаксис, заменив операторы обычными функторами
~ -> not,
& -> and,
v -> or.
% Упростить булеву функцию reduce( X, Y ) :- transform( X, Y ), !. % Не упрощается, остаётся сама собой reduce( X, X ).
% Двойное отрицание transform( not( not( X )), X ). % De Morgan transform( not( and( X, Y )), or( not( X ), not( Y ))). % De Morgan transform( not( or( X, Y )), and( not( X ), not( Y ))). % ......
Я использую SWI-Prolog.

Комментариев нет:

Отправить комментарий