假设我有一个等价关系eq
,以及多个二元运算符o_1, o_2, ... o_n
。我想找出哪些操作分配给其他操作。假设我有一个可以确定两个表达式是否等价的知识库,一个简单的解决方案是输入所有可能的查询:
(对于左分配性)
?- eq(o_1(Z,o_1(X,Y)),o_1(o_1(Z,X),o_1(Z,Y))).
?- eq(o_1(Z,o_2(X,Y)),o_2(o_1(Z,X),o_1(Z,Y))).
?- eq(o_1(Z,o_3(X,Y)),o_3(o_1(Z,X),o_1(Z,Y))).
...
?- eq(o_2(Z,o_2(X,Y)),o_2(o_2(Z,X),o_2(Z,Y))).
?- eq(o_2(Z,o_3(X,Y)),o_3(o_2(Z,X),o_2(Z,Y))).
...
?- eq(o_n(Z,o_n(X,Y)),o_n(o_n(Z,X),o_n(Z,Y))).
但必须有更好的方法来做到这一点。首先,我想定义一个谓词left_dist
这样left_dist(o_m,o_k)
将为我生成相应的查询。我最初以为我会通过使用来做到这一点call
, as in
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))).
但嵌套调用不起作用,原因如下这个问题 https://stackoverflow.com/questions/40443755/eagerly-evaluating-all-predicate-calls-in-prolog,我想这也不是进行 Prolog 编程的好方法。
所以问题是:我如何定义left_dist
,或者以其他方式简化上面的查询,在 Prolog 中?