Prolog中的分布性检查

Prolog中的分布性检查,prolog,Prolog,假设我有一个等价关系eq,和多个二进制运算符o_1,o_2。。。o_n。我想知道哪些操作分配给其他操作。假设我有一个知识库,可以确定两个表达式是否相等,一个简单的解决方案是只输入所有可能的查询: (对于左分配) 但必须有更好的方法来做到这一点。首先,我想定义一个谓词left_dist,这样left_dist(o_m,o_k)将为我生成相应的查询。我最初认为我应该使用call,如中所示 left_dist(O_m,O_k) :- eq(call(O_m,Z,call(O_k,X,Y)),ca

假设我有一个等价关系
eq
,和多个二进制运算符
o_1,o_2。。。o_n
。我想知道哪些操作分配给其他操作。假设我有一个知识库,可以确定两个表达式是否相等,一个简单的解决方案是只输入所有可能的查询:

(对于左分配)

但必须有更好的方法来做到这一点。首先,我想定义一个谓词
left_dist
,这样
left_dist(o_m,o_k)
将为我生成相应的查询。我最初认为我应该使用
call
,如中所示

left_dist(O_m,O_k) :-
   eq(call(O_m,Z,call(O_k,X,Y)),call(O_k,call(O_m,Z,X),call(O_m,Z,Y))).
但是嵌套调用不起作用的原因如中所述,我想这也不是一种很好的方法来进行Prolog编程


所以问题是:我如何在Prolog中定义左距离,或者简化上面的查询?

左分布意味着对于所有的
x,y,z
x*(y+z)=(x*y)+(x*z)

现在你没有提到具体的领域,所以我假设所有的关系都已经知道了。这假设
Add_3
Mult_3
始终终止

not_left_dist(Mult_3, Add_3) :-
   call(Add_3, Y, Z, YZ),
   call(Mult_3, X, YZ, LHS),
   call(Mult_3, X, Y, XY),
   call(Mult_3, X, Z, XZ),
   call(Add_3, XY, XZ, RHS),
   neq(LHS, RHS).

left_dist(Mult_3, Add_3) :-
   iwhen(ground(Mult_3+Add_3), \+ not_left_dist(Mult_3, Add_3) ).

这将使用。

您将需要一些域,您可以对其进行此类声明!
O_m
O_k
背后的直觉是什么?为什么
k
m
表示乘法,
k
表示什么?它们只是这样的标签,1≤ K≤ n和1≤ M≤ N也就是说,
o_m
o_k
可以是开头提到的任何二进制运算符。
not_left_dist(Mult_3, Add_3) :-
   call(Add_3, Y, Z, YZ),
   call(Mult_3, X, YZ, LHS),
   call(Mult_3, X, Y, XY),
   call(Mult_3, X, Z, XZ),
   call(Add_3, XY, XZ, RHS),
   neq(LHS, RHS).

left_dist(Mult_3, Add_3) :-
   iwhen(ground(Mult_3+Add_3), \+ not_left_dist(Mult_3, Add_3) ).