【问题标题】:Why am I getting Type error: `[]' expected, found `[21,3,4,5,6,7,8]' (a list) ("x" must hold one character) with maplist/3 prolog?为什么我收到 Type error: `[]' expected, found `[21,3,4,5,6,7,8]' (a list) ("x" must hold one character) with maplist/3 prolog?
【发布时间】:2017-11-27 14:31:34
【问题描述】:

我是 Prolog 的新手。我想要一个带有列表的谓词,用 maplist/3 处理它,创建一个相应的列表,用零代替小于均值的数字,用 1 代替均值以上的数字。然后我想要第二个谓词对 1 求和,以找出有多少数字高于平均值。然后,第二个谓词返回这个数字,它对应于高于平均值的总数。

我知道下面的代码可以正常工作:

numAtOrAboveMean(Mean, Num, Val) :- Num > Mean -> Val  is 1; Val is 0.
maplist(numAtOrAboveMean(Mean), [], List), sumlist(List, Below). 

当我将其修改为此时,我得到一个预期 [] 但找到一个列表的类型错误。 cmets 对应于我认为谓词行为的方式。

nGMean(Mean, Num, Val) :- Num > Mean -> Val  is 1; Val is 0.%sorts list
nGMean([], _ , []). %takes a list, a constant, relates to a list
nGMean(L, Mean, List) : - maplist(nGMean(Mean), L, List). %maplist call sort

那么总结一下,我将使用第二个谓词。像这样的:

sumtotal(L,V) :- mean(L, M), M2 is M, nGMean(L, M2, List), sum(List, V).

这不起作用可能主要是因为 nGMean 抛出错误。 nGMean 完全错误如下图所示:

所以我的问题是,为什么我会在 nGMean 谓词上遇到这种类型错误?

编辑 - 按照下面 cmets 的要求,这就是全部内容。正如我解释的那样,这是唯一的部分,因为我正在单独测试它。 谢谢你的回答。下次我将发布完整的代码。或者明确表示我只想解决一个谓词。

Maplist for numAtOrAboveMean

Full Pic of code on Editor

【问题讨论】:

  • ERROR: c/users/pcbcj/downloads/file3.pl:6: 检查file3.pl 文件中的第 6 行。这是您需要修复的第一个错误。该消息为您提供了行号。你用的是什么 Prolog 解释器?
  • 您需要至少显示file3.pl 的前6 行。
  • 你好,第六行对应谓词的最后一行。 nGMean(L, Mean, List) : - maplist(nGMean(Mean), L, List)。 %maplist 调用排序
  • 我正在使用 Hessischer Bildungsserver 和 SWI prolog
  • 您能否一次显示整个文件的前 6 行,而不是分成几部分来查看您的解释器看到的内容?

标签: prolog maplist


【解决方案1】:

您应该发布可以复制和运行的完整代码。在您发布的内容中,mean/2sum/2 未定义。

(加法:)错误的原因似乎是您正在比较一个值和一个列表(2<[2,3|...])。发生这种情况的原因是因为nGMean/3 的第一个子句将Mean 作为第一个参数,而其他子句具有列表,即列表变为Mean,用于比较(Num > Mean)。我不确定> 是如何变成< 的。

另外,在空列表上调用maplist/3 没有意义。

递归谓词应该有两个子句。一个递归子句(通常)对列表的头部做一些事情,然后在尾部递归调用,以及一个基本情况(空列表)。

nGMean([Num|Nums],Mean,[Val|List]) :-
  ( Num > Mean ->
    Val = 1
  ; Val = 0 ),
  nGMean(Nums,Mean,List).
nGMean([],_,[]).

有了这个定义,我得到的输出与你上面的前两行相同,所以我相信这就是你想要的。

(前面的补充:当右侧包含数学计算时,您只需要使用is。如果只是设置一个值,= 就可以了。)

【讨论】:

  • 您好,我似乎将列表与数字进行比较的原因是因为该部分是通过 maplist 调用的。所以,据我所知,你可以做到这一点。另外,我不发布整个代码很糟糕,但我真的只想解决 nGMean 的问题。
  • 只是为了澄清:我正在使用 maplist 将列表中的每个元素与平均值进行比较。这是一个合法的序言操作,更多:swi-prolog.org/pldoc/doc_for?object=maplist/3
猜你喜欢
  • 2011-04-14
  • 2023-01-12
  • 2014-03-09
  • 2022-08-22
  • 2022-12-28
  • 2011-06-03
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多