Вы можете создать предикат, который упрощает выражение.
Например, мы знаем, что and(X, Y)
, где X
и Y
равны, равно X
.
Таким образом, мы можем написать предикат вроде:
simplify(and(X1, X2), Y1) :-
simplify(X1, Y1),
simplify(X2, Y2),
Y1 == Y2,
!.
simplify(or(X1, X2), Y1) :-
simplify(X1, Y2),
simplify(X2, Y1),
Y1 == Y2,
!.
simplify(not(not(X)), Y) :-
simplify(X, Y),
!.
simplify(X, X).
Здесь мы таким образом определяем три правила: and(X, X)
равно X
, or(X, X)
равно X
и not(not(X))
равно X
.Мы делаем дополнительные вызовы, поскольку возможно иметь not(not(and(3 < 5, 3 < 5)))
, поэтому мы все еще хотим упростить значение inner .Затем мы получаем:
?- simplify(not(not(and(3 < 5, 3 < 5))), X).
X = (3<5).
Могут быть добавлены другие элементы (перед последним предложением в предыдущем фрагменте кода), такие как:
simplify(X > Y, S) :-
simplify(Y < X, S).
simplify(X >= Y, S) :-
simplify(Y =< X, S).
Так, например, and(5 < 3, 3 > 5)
упрощенодо 3 < 5
.