我一直在研究Prolog可以自动简化语句的方法。这是因为我计划从外部源接收Prolog语句,而不一定要手动创建。
我从诸如Simplify Expressions in Prolog这样的问题中看到,数学表达式可以简化,而Prolog处理得很好。
不过,我想知道它是否还能做点别的。请考虑以下几点:
and(X, Y) :- X, Y.
simplified(X) :- X.
?- simplified(and(5 > 3, 5 > 3)).
在这个例子中,我有一个简单的语句,它接受两个值。但在本例中,这两条语句是相同的,因此没有意义。我想知道Prolog是否有一种方法,或者是否有一种方法来检测它来删除它,以便它只对语句进行一次而不是两次评估,从而简化了它需要执行的调用。
我希望这是有意义的,我意识到这个问题可能有点奇怪,但我有一个明确的理由想知道这个问题,并计划在可能的情况下做一些更复杂的事情。
提前谢谢。
发布于 2018-10-08 12:12:04
您可以构造一个谓词来简化表达式。
例如,我们知道,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)))
是可能的,所以我们仍然希望简化内部值。这样我们就可以得到:
?- 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
。
https://stackoverflow.com/questions/52700063
复制相似问题