我正在尝试从学校获得一个古老的练习,但我不知道该如何解决。这是预期的结果:
bC([1,12,34,23,11],23,Res)。
Res = 1 + 11-12 + 23
因此,bC/3
应该从数字(第一个参数)列表中找到加法或减法运算(第三个参数)的每个组合以匹配结果(第二个参数)。
我找不到解决该问题的方法...如果有人可以给我有关此问题的线索,我将不胜感激。
更新:可以忽略列表中的某些元素。
答案 0 :(得分:0)
作为提示:您可以通过彻底搜索表达式空间来构建所有表达式。由于X - (Y - Z)
只是X - Y + Z
,这是个好消息,因为我们可以将我们限制在 left递归表达式中,例如:
makepm([], ExpI, ExpI).
makepm([H|T], ExpI, ExpO) :-
makepm(T, +(ExpI, H), ExpO).
makepm([H|T], ExpI, ExpO) :-
makepm(T, -(ExpI, H), ExpO).
如果将第一个元素设为1
,然后将列表的其余部分注入makepm/3
,则得到:
?- makepm([12,34,23,11], 1, F).
F = 1+12+34+23+11 ;
F = 1+12+34+23-11 ;
F = 1+12+34-23+11 ;
F = 1+12+34-23-11 ;
F = 1+12-34+23+11 ;
F = 1+12-34+23-11 ;
F = 1+12-34-23+11 ;
F = 1+12-34-23-11 ;
F = 1-12+34+23+11 ;
F = 1-12+34+23-11 ;
F = 1-12+34-23+11 ;
F = 1-12+34-23-11 ;
F = 1-12-34+23+11 ;
F = 1-12-34+23-11 ;
F = 1-12-34-23+11 ;
F = 1-12-34-23-11.
还需要做些什么:关于是否可以省略数字的问题还不是很清楚,如果是这样,那么您应该写一个先选择一个子集的谓词数字。然后,我们可以详尽地枚举用makepm/3
创建的所有表达式,然后我们需要进行验证,例如使用is/2
[swi-doc]谓词来确定该表达式的总和是否等于所请求的值。如果是这样,则谓词可以成功。