在Prolog中统计列表中某个字符出现的次数

3
walls(This) :- 
    append(This, NewMap),
    length(NewMap, N),
    numWalls(NewMap, W),
    W >= N/10.

numWalls([], _, 0).
numWalls('w'|Tail, W) :-
    W is W1 + 1,
    numWalls(Tail, W1).
numWalls(_|Tail, W):-
    numWalls(Tail, W).

我逐行注释并删除numWalls(NewMap, W)这一行,直到得到false。append函数可以将一个二维数组压平,而length函数返回压平地图的正确长度。我们需要计算列表中出现'w'的次数,如果超过列表的10%,则返回True。


walls(Maps) :- 
    append(Maps, NewMap),
    length(NewMap, N),
    print(NewMap),
    numWalls(NewMap, W),
    print(W) .

numWalls([], 0).
numWalls(['w'|Tail], W) :-
    numWalls(Tail, W1),
    W1 is W-1.
numWalls([_|Tail], W):-
    numWalls(Tail, W).

"错误: is/2: 参数未充分实例化"。看起来错误出在我的is语句上?

1个回答

5

看起来你少了一些方括号。除此之外,你的程序逻辑是正确的:

numWalls([], 0).
numWalls(['w'|Tail], W) :-
    numWalls(Tail, W1),
    W is W1 + 1.
numWalls([H|Tail], W):-
    H \= (w),
    numWalls(Tail, W).

编辑:false所评论的那样,第二条规则需要改变来避免错误地消耗一个w,以避免numWalls([w,w],0)。成功。

在ideone上查看演示。


修复括号后,参数未充分实例化。我认为还需要将W is W1+1更改为W is W1-1。 - theB3RV
1
尝试交换递归调用和加法行的顺序。 - Sergey Kalinichenko
将它们交换位置可以消除错误,我去掉了 W >= N/10 并在其位置上放置了一个 print(W) 语句,但它不会打印出 W。 - theB3RV
1
当我把W改成W1 + 1时,它就出问题了。感谢您的所有帮助:D - theB3RV
1
@dasblinkenlight: numWalls([w,w],0) 成功的结果是错误的。你需要在最后一个子句中加入一个干净的保护条件。 - false
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接