Can you count the letter f in:
Q: Изменение исходной булевой функции по правилу де Моргана в 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).

Перебирал различные варианты.
Можете подсказать в чем заключается проблема? Как подавать и обрабатывать выражение? 

A: 
Как подавать и обрабатывать выражение? 

Я, пожалуй, упро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. 


user
The passage contains 14 "f"s.
assistant