我是 Prolog 的新手。我想要一个带有列表的谓词,用 maplist/3 处理它,创建一个相应的列表,用零代替小于均值的数字,用 1 代替均值以上的数字。然后我想要第二个谓词对 1 求和,以找出有多少数字高于平均值。然后,第二个谓词返回这个数字,它对应于高于平均值的总数。
我知道下面的代码可以正常工作:
numAtOrAboveMean(Mean, Num, Val) :- Num > Mean -> Val is 1; Val is 0.
maplist(numAtOrAboveMean(Mean), [], List), sumlist(List, Below).
当我将其修改为此时,我得到一个预期 [] 但找到一个列表的类型错误。评论对应于我认为谓词行为的方式。
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 谓词上遇到这种类型错误?
编辑-正如下面评论中的要求是整个事情。正如我解释的那样,这是唯一的部分,因为我正在单独测试它。谢谢你的回答。下次我将发布完整的代码。或者明确表示我只想解决一个谓词。