Prolog - 简化规则或语句

Prolog - Simplifying rules or statements

我一直在研究 Prolog 可以自动简化语句的方法。这是因为我计划从外部源接收 Prolog 语句,不一定要手动创建。

我从诸如此类的问题中了解到:Simplify Expressions in Prolog 可以简化数学表达式并且 Prolog 处理得很好。

但是我想知道它是否可以做其他事情。考虑以下因素:

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

simplified(X) :- X.

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

在这个例子中,我有一个简单的 and 语句,它接受两个值。在此示例中,虽然这两个语句相同,但毫无意义。我想知道 Prolog 是否有办法或者是否有办法检测到它以将其删除,以便它只对语句求值一次而不是两次,从而简化它需要做的调用。

我希望这是有道理的,我意识到这个问题可能有点奇怪,但我有一个特定的原因想知道这一点,并计划在可能的情况下稍后做一些更复杂的事情.

提前致谢。

您可以构造一个谓词来简化表达式。

例如我们知道 and(X, Y) 其中 XY 相等,等于 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)等于Xor(X, X)等于Xnot(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