Доброго дня.
Мне нужно написать программу на прологе, которая меняла бы участки выражения на эквивалентные по правилу де Моргана.
Сложность в том, что программа получает в качестве аргумента темр состоящий из функторов, которые в свою очередь содержат еще функторы.
Т.е. выражение вида ~(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).
Перебирал различные варианты. Можете подсказать в чем заключается проблема? Как подавать и обрабатывать выражение?
Однако программа изменяет в небольшие выражения, если ввести
~((x v z) & (x v y)) & (~(x & y) v t & u) как
and(not((and(or(A,C), or(A,B)))), or(not(and(A,B)),and(D, E)), то программа выведет исходный терм т.к. не видит подвыражения.
Я пытался решить эту проблему с помощью arg(), увы не вышло – Volv58 May 20 '17 at 02:52
transform( XX & YY v ZZ, (XX v ZZ) & (YY v ZZ)). transform( XX v YY & ZZ, (XX v YY) & (XX v ZZ)). transform( XX v YY, XX1 v YY):- transform( XX, XX1). transform( XX v YY, XX v YY1):- transform( YY, YY1). transform( XX & YY, XX1 & YY):- transform( XX, XX1). transform( XX & YY, XX & YY1):- transform( YY, YY1).– Volv58 May 21 '17 at 15:12arg(_, Term, Value_Basic),arg(_, Result_Term, Value_of_ResTerm),некорректно. Я не помню -arg(-,+,+)валидный режим дляarg/3. В любом случае_- это не имя, а обозначение анонимной переменной . Они разные и не передают значений. т.е. их надо заменить на норм. переменные. – Anton Danilov May 21 '17 at 19:12