编写谓词以使用某些运算符平衡方程

时间:2015-03-02 21:46:05

标签: prolog

我正在尝试编写一个谓词balance(Xs, Eqn),以便例如如果列表Xs[2,3,5,7,11],那么应该在列表的元素之间放置一些运算符(+, - ,*,\,=)(保持相同的顺序)以平衡等式Eqn。一些例子:

Eqn = (2=3-(5+7-11))
Eqn = (2=(3*5+7)/11)

我可以使用= ..和=:=来提取和比较等式的左右,但我不知道如何在元素之间获得不同的运算符。

任何提示?感谢。

1 个答案:

答案 0 :(得分:2)

生成和测试将很容易解决...

如果通常将等式视为“特殊”,则将列表拆分为2个非空列表(追加/ 3可以方便地执行此操作)。

然后递归插入每个运算符的两个列表,最后只使用Left =:= Right

操作员放置和初始列表拆分之间的回溯将找到所有解决方案,如果有......

轻松放置样本:

place_ops([N],N) :- !.
place_ops([N|T],E) :- member(Op, [+,-]), E =.. [Op,N,P], place_ops(T,P).

产量

?- place_ops([1,2,3],E).
E = 1+ (2+3) ;
E = 1+ (2-3) ;
E = 1- (2+3) ;
E = 1- (2-3).