2016-04-11 9 views
1

(SWI-プロローグを使用して次のプログラムをロードし、そのような回避方法複数の回答を探す際にグローバルスタックエラーが発生しましたか?

cells([o,x,o,x,o], A). 

又は

cells(A, [o,x,o,x,o]). 

としてクエリを入力した後最初の結果は常に正しいと思われるが、セミコロンを提出した後、検索結果を探すためにどちらの場合でも追加の結果が必要かどうかわかりません)、ガベージコレクションとグローバルスタックエラーのそれぞれについてのPROLOG SYSTEM ERRORが表示されます。

regla(o,o,o,o). 
regla(x,o,o,x). 
regla(o,x,o,o). 
regla(o,o,x,x). 
regla(x,o,x,x). 
regla(x,x,o,x). 
regla(o,x,x,x). 
regla(x,x,x,o). 

cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

cellsR(_, []). 
cellsR([A, B, C | R], [H | T]) :- 
    regla(A, B, C, H), 
    cellsR([B, C | R], T). 

私はエラーが私は再帰を処理する方法としなければならないことを仮定しているので、多分誰かがコードを見ていると私は間違っているつもりだところを私に伝えることができます。

+0

'trace'を実行すると、何が起こっているのかがわかります。 – lurker

答えて

3

私の最初のアドバイス:トレーサを使用しないでください。それはあなたに多くの助けにはなりません。終了は、ステップバイステップのトレーサが表示できるものよりも複雑すぎます。私はあなたのプログラムは、最初、終了しない理由を挙げてみましょう:

 
cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), false, 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

これは、あなたがあなたの問題を取り除くために変更するを持っていますあなたのプログラムの一部を強調しています。言い換えれば、あなたがその部分を変更しない限り、あなたの問題は解決されません。

最小限の変更はlength/2が使用される前に、まずそれらの二つのリストの長さとの関係を確立し、さらに目標を追加することです:

cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    list_samelength([_,_|XS], YS), 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

list_samelength([], []). 
list_samelength([_|Xs], [_|Ys]) :- 
    list_samelength(Xs, Ys). 

は、この技術の詳細についてはを参照してください。

+0

返信いただきありがとうございます!あなたが提案している解決策は、このトリックを行うようですが、list_samelengthが既にチェックしているので、コードのこの部分が不要な '([Y | YS]、LY)、LYはLX + 2です。私が理解できないことは、それが起こる理由です。 – luckysori

+0

@luckysori:なぜ**何が起こるのですか? – false

+0

私の元のプログラムでの終了の欠如。私はどこが間違っていたのか分かりますが、なぜそうではありません。 – luckysori

関連する問題