2013-05-07 131 views
-1

我想在Prolog中编写一个关系分割,它需要一个整数N,整数列表L和其他参数,列表L是平的。如果列表L可以分成三个子集,则每个子集中的整数之和严格小于N,否则关系split将返回true。否则,该关系返回false。这是到目前为止,我走得最远:Swi Prolog的关系

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). 

- ERROR:顶层:未定义的程序:list_sum/2(DWIM不能正确的目标) 任何帮助和解释是高度赞赏。

+2

那不能是真正的代码! – CapelliC 2013-05-07 05:13:58

+0

你需要走得更远。 – 2013-05-07 06:05:36

+0

给出一些有用的建议:首先用自己的话写下解决方案算法,并与我们分享。 – 2013-05-07 06:12:18

回答

1

基本上你的问题是你需要去学习Prolog。我不是在开玩笑。如果你认为自己能够逃脱这种“不理解”的等级,并且在S.O.上拿下其他等级,你将会失败。

  1. 什么是第一行,一条评论?将注释字符放在那里。
  2. 什么是list_sum/2在您的split/4定义的中间位置?
  3. 除非你想创建某种差异列表或解构算术,否则[Head + Tail]绝对不会做你想要的。
  4. 什么是list_sum>N应该表示在下一行? Prolog中只有一个命名空间,语言非常非常依赖于让您的大小写正确。由于这种马虎,这并不是一个好兆头。
  5. 你为什么在第7行切割?
  6. 当前两个规则负责人(我认为?)正在定义split/4时,您的最后一行是定义split/5。这不可能是你的意思。
  7. 您在第4行的模式匹配要求所有三个列表都以相同的值开始,这看起来像是一个非常特殊的特例,因为您没有其他可以有效检查列表元素的特殊情况。

在我看来,这段代码是完全无法改变的。扔掉它并重新开始。并首先阅读教程。

1

对于您的确切问题:您有而不是定义了一个谓词list_sum,其中包含两个您已显示的“代码”中的参数。这是错误告诉你的。