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になります。追加は2次元配列をフラット化し、lengthはフラット化されたマップの適切な長さを返します。リストのリストに「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).

編集: falseがコメントしたように、成功wを避けるために、2 番目のルールを誤って消費しないように変更する必要があります。numWalls([w,w], 0).

ideone のデモへのリンク。

于 2012-12-01T22:42:32.297 に答える