2012-12-01 86 views
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)行爲止。 append平坦化一個二維數組,長度返回平展地圖的適當長度。我們需要計算一個'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). 

「ERROR:是/ 2:論點是沒有充分實例化」 貌似錯誤是我的說法?

回答

4

看起來你缺少一些方括號。除此之外,小的語法問題,你的程序邏輯是罰款:

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).得逞。

Link to a demo on ideone.

+0

固定括號後,參數沒有被充分實例化。我認爲還需要改變W是W1 + 1到W是W1-1。 – theB3RV

+1

@ theB3RV嘗試切換遞歸調用和添加行。 – dasblinkenlight

+0

切換它們擺脫了錯誤,我拿出W> = N/10,並在它的位置放置一個打印(W)語句,它不會打印出W。 – theB3RV

相關問題