谓词算术组合(仅+或-)可从数字列表中查找结果

时间:2018-09-21 23:10:53

标签: prolog

我正在尝试从学校获得一个古老的练习,但我不知道该如何解决。这是预期的结果:

  

bC([1,12,34,23,11],23,Res)。

     

Res = 1 + 11-12 + 23

因此,bC/3应该从数字(第一个参数)列表中找到加法或减法运算(第三个参数)的每个组合以匹配结果(第二个参数)。

我找不到解决该问题的方法...如果有人可以给我有关此问题的线索,我将不胜感激。

更新:可以忽略列表中的某些元素。

1 个答案:

答案 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]谓词来确定该表达式的总和是否等于所请求的值。如果是这样,则谓词可以成功。