【问题标题】:Predicate arithmetic combination (only + or -) to find a result from a list of numbers谓词算术组合(仅 + 或 -)从数字列表中查找结果
【发布时间】:2018-09-26 22:43:28
【问题描述】:

我正在尝试从我的学校完成一项旧练习,但我不知道如何解决它。这是预期的结果:

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

分辨率 = 1+11-12+23

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

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

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

【问题讨论】:

  • 你可以尝试穷举构造所有的syntax树,每次都验证结果是不是请求的结果。
  • 所以有些元素可以省略(这里是34)?还是这是一个错误?
  • 是的,有些元素可以省略。

标签: prolog


【解决方案1】:

作为提示:您可以通过在表达式空间中进行详尽的搜索来构建所有表达式。由于X - (Y - Z) 只是X - Y + Z,这是个好消息,因为我们可以限制我们使用左递归 表达式,例如:

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] 谓词,该表达式的总和等于请求的值。如果是这种情况,谓词可以成功。

【讨论】:

  • 这是一个很好的提示:)。我将尝试将您的谓词与我在这里找到的 stackoverflow.com/questions/4578755/… 一起使用,以获得所有可能的置换组合。我开始明白我现在必须如何思考才能解决这类问题......
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
相关资源
最近更新 更多