Пролог - Упрощение правил или утверждений - PullRequest
0 голосов
/ 08 октября 2018

Я искал способы, которыми Prolog может автоматически упростить утверждения.Это потому, что я планирую получать утверждения Пролога из внешнего источника и не обязательно буду создаваться вручную.

Я видел по таким вопросам, как этот: Упрощенные выражения в Прологе , которыематематические выражения могут быть упрощены, и Prolog справляется с этим довольно хорошо.

Однако мне интересно, может ли он сделать что-то еще.Рассмотрим следующее:

and(X, Y) :- X, Y.

simplified(X) :- X.

?- simplified(and(5 > 3, 5 > 3)).

В этом примере у меня есть простое утверждение, которое принимает два значения.В этом примере, хотя два утверждения одинаковы и поэтому бессмысленны.Мне интересно, есть ли у Пролога способ или есть способ обнаружить это, чтобы удалить его, чтобы он вычислял оператор только один раз, а не дважды, упрощая вызов, который ему нужно сделать.

Я надеюсь,это имеет смысл, и я понимаю, что вопрос, вероятно, немного странный, но у меня есть особая причина, по которой я хочу это знать и планирую сделать что-то более сложное в дальнейшем, если это возможно.

Заранее спасибо.

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете создать предикат, который упрощает выражение.

Например, мы знаем, что 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.

...