Prolog 使用一些运算符编写谓词来平衡方程

Prolog 使用一些运算符编写谓词来平衡方程,prolog,Prolog,我试图编写一个谓词balance(Xs,Eqn),例如,如果列表Xs是[2,3,5,7,11],那么一些运算符(+、-、*、\、=)应该放在列表的元素之间(保持相同的顺序)以平衡方程Eqn。一些例子: Eqn = (2=3-(5+7-11)) Eqn = (2=(3*5+7)/11) 等等 我可以用=。。and=:=提取并比较等式的左侧和右侧,但首先我不确定如何在元素之间获得不同的运算符 有什么提示吗?谢谢。生成和测试将使问题更容易解决 如果等式通常被认为是“特殊的”,那么将列表分成两个非空列

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

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

我可以用=。。and=:=提取并比较等式的左侧和右侧,但首先我不确定如何在元素之间获得不同的运算符


有什么提示吗?谢谢。

生成和测试将使问题更容易解决

如果等式通常被认为是“特殊的”,那么将列表分成两个非空列表(append/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).

详细说明Capelical关于使用
append/3
的线索,您可以执行,
append([HL | TL],[HR | TR],L)
L
拆分为两个非空列表。您需要一个递归谓词通过二进制解析树在每对分支上应用一个运算符。当您创建了两个表达式时,例如,
E1
E2
,然后可以与
E1=:=E2
进行比较。实际上,在实现过程中,它比听起来更简单。:)非常感谢。有一件事:如何编辑place_ops谓词以包含例如
e=(1-2)+3
?尝试在e=。。[…]这颠倒了表达式的顺序,但没有包括我上面提到的示例。。。可能会反转并应用左递归