List 使用单个子句计算列表中任意三个成员的总和是否等于给定值

List 使用单个子句计算列表中任意三个成员的总和是否等于给定值,list,prolog,List,Prolog,除下列功能外,我们不应使用任何其他功能: 必须定义单个子句(不再定义) + , :- 是 列表 列表类型的头和尾语法 变数 例如sumlists([1,2,3,5,7],11)那么程序执行应该打印TRUE。因为1+3+7(任意三个)=11(给定N值)。理想情况下,我们要么得到一个元素,要么不得到,就像我们沿着输入列表一样;我们要么在达到所需金额,要么超过所需金额,要么在列表用尽时停止 但是我们这里只能有一个子句一个谓词,并且只能使用某些原语,因此我们偷偷地使用+这两种符号来收集求和信息

除下列功能外,我们不应使用任何其他功能:

  • 必须定义单个子句(不再定义)
  • +
  • :-
  • 列表
  • 列表类型的头和尾语法
  • 变数

例如
sumlists([1,2,3,5,7],11)
那么程序执行应该打印
TRUE
。因为1+3+7(任意三个)=11(给定N值)。

理想情况下,我们要么得到一个元素,要么不得到,就像我们沿着输入列表一样;我们要么在达到所需金额,要么超过所需金额,要么在列表用尽时停止

但是我们这里只能有一个子句一个谓词,并且只能使用某些原语,因此我们偷偷地使用
+
这两种符号来收集求和信息,并将其本身作为算术运算:

sumlists(L, N) :-
      N = X+A+B+C, X is A+B+C, !
   ;  L = [H|T], sumlists(T, N+H)
   ;  L = [H|T], sumlists(T, N).

一个小句还是一个谓语?似乎已经被问到了。但是那里的答案不符合要求。尽管如此,SO的方式还是建议我们在那里发布答案,并将此答案作为副本关闭。(?)特别是因为这个问题中没有包含尝试的代码。我决定在这里发布一个答案,因为建议的副本询问了它包含的用户代码。我的回答正好回答了这个问题。@PauloMoura从建议使用的
判断,带单个子句的单个谓词。甚至不允许分组参数
。)你在作业中有没有做过任何特别的尝试?这真是一个奇妙的把戏!追踪行刑过程真的很有趣。感谢您抽出时间与我们分享@DanielLyons谢谢,我玩得很开心,:)主要是因为需求。要收集“迄今为止选择的ELT”,我们似乎需要第三个参数,所以,另一个谓词。。。可以从目标中减去所选的elt,但不允许使用
-
。。。然后,灯泡:象征性地减法就是收集;而
+
-
,象征性地,并不重要!教训:“救援评估延迟!”几乎像雷诺兹的失灵,甚至。。。很好的锻炼。(尽管有需求,但无法完全确定)