我正在尝试编写一个谓词balance(Xs, Eqn)
,以便例如如果列表Xs
是[2,3,5,7,11]
,那么应该在列表的元素之间放置一些运算符(+, - ,*,\,=)(保持相同的顺序)以平衡等式Eqn。一些例子:
Eqn = (2=3-(5+7-11))
Eqn = (2=(3*5+7)/11)
等
我可以使用= ..和=:=来提取和比较等式的左右,但我不知道如何在元素之间获得不同的运算符。
任何提示?感谢。
答案 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).