2012-12-01 3 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)를 꺼내 때까지 거짓 얻을. 추가는 2 차원 배열을 평평하게하고 길이는 평평한지도의 적절한 길이를 반환합니다. '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). 

"오류 :/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으로, 두 번째 규칙은 성공에서 numWalls([w,w], 0).을 방지하기 위해, 실수로 w 소비에 대해 변경해야합니다.

Link to a demo on ideone.

+0

대괄호를 수정 한 후에 인수가 충분히 인스턴스화되지 않습니다. W를 W1 + 1로 바꾸려면 W를 W1-1로 바꾸어야합니다. – theB3RV

+1

@ theB3RV 재귀 호출과 추가 행을 전환 해보십시오. – dasblinkenlight

+0

주위를 전환하면 오류가 없어지고 W> = N/10을 꺼내서 그 자리에 인쇄 (W) 문을 넣으면 W가 인쇄되지 않습니다. – theB3RV