-1

我正在尝试在 Prolog 中编写一个关系拆分,它采用整数 N、整数列表 L 和其他参数,列表 L 是平坦的。如果列表 L 可以分为三个子集,则关系拆分返回 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).

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

4

2 回答 2

1

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

于 2013-05-07T06:13:38.013 回答
1

基本上你的问题是你需要去学习 Prolog。我不是在开玩笑。如果您认为自己可以摆脱这种“没有得到它”的水平并在 SO

  1. 第一行是什么,评论?将注释字符放在那里。
  2. 你的定义list_sum/2中间在做什么split/4
  3. 除非您尝试创建某种差异列表或解构算术,[Head + Tail]否则绝对不会做您想做的事。
  4. list_sum>N下一行应该是什么意思?Prolog 中只有一个命名空间,并且该语言非常非常依赖于正确的大小写。如此草率并不是好兆头。
  5. 为什么要剪掉第 7 行?
  6. 您的最后一行是定义split/5前两个规则头(我认为?)何时定义split/4. 这不可能是你的意思。
  7. 您在第 4 行进行模式匹配要求所有三个列表都以相同的值开头,考虑到您没有其他可以有意义地检查列表元素的情况,这似乎是一个非常特殊的特殊情况。

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

于 2013-05-07T05:18:30.223 回答