Prolog-简化规则或陈述

时间:2018-10-08 10:15:59

标签: prolog simplify

我一直在寻找Prolog自动简化语句的方式。这是因为我打算从外部来源接收Prolog语句,而不必手动创建。

我从诸如Simplify Expressions in Prolog这样的问题中看到,数学表达式可以简化,而Prolog可以很好地处理。

但是我想知道它是否还能做其他事情。请考虑以下内容:

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

simplified(X) :- X.

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

在此示例中,我有一个简单的and语句,它包含两个值。在此示例中,尽管两个语句相同,所以毫无意义。我想知道Prolog是否有办法或者是否有办法检测到该问题以将其删除,以便它仅对语句进行一次评估而不是两次评估,从而简化了需要执行的调用。

我希望这是有道理的,并且我意识到这个问题可能有点怪异,但是我有一个特定的原因想知道这一点,并计划在可能的情况下做一些更复杂的事情。< / p>

谢谢。

1 个答案:

答案 0 :(得分:1)

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

例如,我们知道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)等于Xor(X, X)等于X,而not(not(X))等于{{1 }}。由于可以使用X,因此我们会进行额外的呼叫,因此我们仍然想简化 inner 值。然后,我们得到:

not(not(and(3 < 5, 3 < 5)))

可以添加其他项目(在上一个代码片段的最后一个子句之前),例如:

?- 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)