Swi Prolog关系

时间:2013-05-07 05:02:42

标签: prolog

我正在尝试在Prolog中编写一个关系分割,它采用整数N,整数列表L和其他参数,列表L是平的。如果列表L可以被分成三个子集,则关系split返回true,使得每个子集中的整数之和严格小于N.否则,该关系返回false。这是迄今为止我走得最远的地方:

split(list, list, list, list)
split([],[],[],[]).
list_sum([],0).
split([X|L], [X|L1], [X|L2], L3):-
list_sum([Head + Tail]),
list_sum>N,
!,
split(N, L,L1, L2, L3).

? - 错误:toplevel:未定义的过程:list_sum / 2(DWIM无法纠正目标) 任何帮助和解释都非常感谢。

2 个答案:

答案 0 :(得分:1)

基本上你的问题是你需要去学习Prolog。我不是在开玩笑。如果你认为你可以通过这种水平“没有得到它”并且在S.O上取得其余的水平,那么你将失败。

  1. 第一行是什么,评论?把评论字符放在那里。
  2. 在您list_sum/2定义的中间split/4做什么?
  3. 除非您尝试创建某种差异列表或解构算法,否则[Head + Tail]绝对不能达到您想要的效果。
  4. list_sum>N在下一行应该是什么意思? Prolog中只有一个命名空间,而且语言非常非常依赖于获得正确的大写。这种草率并不是好兆头。
  5. 你为什么要在第7行切割?
  6. 当前两个规则标题(我认为?)正在定义split/5时,您的最后一行是定义split/4。这可能不是你的意思。
  7. 你在第4行的模式匹配要求所有三个列表都以相同的值开头,这似乎是一个非常特殊的特殊情况,考虑到你没有其他你有意义地检查列表元素。
  8. 在我看来,这段代码完全不可挽回。扔掉它然后重新开始。并首先阅读教程。

答案 1 :(得分:1)

对于您确切的问题:您已经在您显示的“代码”中定义了带有两个参数的谓词list_sum。这就是错误告诉你的。