2016-05-21 9 views
0
unwindHead([E|Es], F) :- unwinded(E); unwindHead(E, E). 
unwinded(L) :- \+ is_list(L). 

?- unwindHead([[1]], X). 

上記はtrueを返しますが、Xを返しません。どうして?プロローグの巻き戻しリスト

+0

'unwindHead'の2番目の引数が* singleton *なので、' X'を何とか統一しません(警告メッセージが表示されました。つまり、1つの場所でのみ使用する変数があるため、使用されていない値で統一されたり、値で統一されることはありません。 – lurker

+0

よろしくお願いします。私はそれをrightideで使用しようとしましたが、結果は同じです:( – Gilgamesz

+0

正直なところ、この述語には一般的に何をしたいかわからない – lurker

答えて

1

あなたが持っているものは非常に近く、私はあなたがちょうどプロローグでねじれていると思う。最初にそれを論理的に分解してから、Prologを見てください。正しくは、リストの最初の要素自体がリストであるかどうかという点で考えています。その後、我々はEを取得し、我々は[E|_]Eがリストではありません「くつろぎ」場合

  1. :ルールはどのように見えるかを書き出します。
  2. [E|_]Eがリストである場合は、結果を得るために「再帰的に」「巻き戻す」Eを返します。

    unwind_head([E|_], E) :- \+ is_list(E). 
    unwind_head([E|_], F) :- is_list(E), unwind_head(E, F). 
    

    "のif-else" あなたはまた、このために構築プロローグを使用することができます:私たちはどのような尾を気にしたことがない

    unwind_head([E|_], F) :- 
        ( is_list(E) 
        -> unwind_head(E, F) 
        ; F = E 
        ). 
    

    ノートのようになります

リストですので、_を使用できます。

+0

ありがとうございました。 1. Prologで検索ツリーを印刷できますか? 2.ステップバイステップでデバッグすることは可能ですか? 3.すべてのifは、答えの最初の例で説明されている構造に置き換えることができます。そうですか? – Gilgamesz

+0

@Gilgamesz 'trace 'を使って段階的にデバッグすることができます。ただし、検索ツリーは印刷されません。あなたは手でそれをする必要があります。 – lurker

関連する問題