我一直在寻找Prolog自动简化语句的方式。这是因为我打算从外部来源接收Prolog语句,而不必手动创建。
我从诸如Simplify Expressions in Prolog这样的问题中看到,数学表达式可以简化,而Prolog可以很好地处理。
但是我想知道它是否还能做其他事情。请考虑以下内容:
and(X, Y) :- X, Y.
simplified(X) :- X.
?- simplified(and(5 > 3, 5 > 3)).
在此示例中,我有一个简单的and语句,它包含两个值。在此示例中,尽管两个语句相同,所以毫无意义。我想知道Prolog是否有办法或者是否有办法检测到该问题以将其删除,以便它仅对语句进行一次评估而不是两次评估,从而简化了需要执行的调用。
我希望这是有道理的,并且我意识到这个问题可能有点怪异,但是我有一个特定的原因想知道这一点,并计划在可能的情况下做一些更复杂的事情。< / p>
谢谢。
答案 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)
等于X
,or(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)
。