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)
其中 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
。
我一直在研究 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)
其中 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
。