【问题标题】:Counting the number of elements in a list ignoring adjacent duplicates计算列表中忽略相邻重复项的元素数
【发布时间】:2019-03-03 20:13:47
【问题描述】:
count([], 0).

count([H,H1|T], N) :- (H == H1,
                  count([H1|T], N));

                  (N1 is N-1,
                  count([H1|T], N1)).   

我的直觉是,第一个“if”只是移动到“下一个头”,如果相邻元素相同,则 N 不会递减,但是如果它们不同,第二个会递减。然后,当列表清空时,它是真的。

也许我稍微误解了 Prolog 中的回溯,但这不应该产生正确的答案吗?

例如,我收到此错误:

?- count([3,4,5,6],C).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:    [8] count([3,4|...],_972)
ERROR:    [7] <user>

【问题讨论】:

  • Prolog 的“或”不是,重复 不是“否则”。
  • 所以我应该在第二个 'if' 中添加一个 H != H1 子句对吗?
  • == 的反面是\==,我想,但请检查the manual
  • != 不是 Prolog 运算符。

标签: list prolog instantiation-error


【解决方案1】:

N1 is N-1 意味着N 必须是一个数字。但是您在该位置调用 count([3,4,5,6],C) 时使用未实例化的 C

它变成N,然后is 失败,因为它还没有被实例化。

你为什么要减去呢?要计算出现次数,您应该在检测到此类事件时将递归找到的计数加 1,而不是减去。

或者完全忘记is,切换到约束,使用#=。请参阅 了解更多信息。

【讨论】:

  • 好的,我已经稍微更新了我的代码,其中有一个新的谓词来实例化计数器。我现在只是得到false 的一切?你怎么看它会
  • 全新的代码,应该是全新的问题。 :)
  • 我提出了一个新问题。如果我在发布时出错了,请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多