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), 行。追加展平二维数组,长度返回展平地图的正确长度。我们需要计算“w”在列表列表中出现的次数,如果超过 10% 的列表是“w”,则返回 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 语句有关?

4

1 回答 1

5

看起来您缺少一些方括号。除了那个小的语法问题,你的程序逻辑很好:

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

编辑:正如错误的评论,第二条规则需要改变w以防止误用 a ,以避免numWalls([w,w], 0).成功。

链接到 ideone 上的演示。

于 2012-12-01T22:42:32.297 回答