unwindHead([E|Es], F) :- unwinded(E); unwindHead(E, E).
unwinded(L) :- \+ is_list(L).
?- unwindHead([[1]], X).
上記はtrueを返しますが、X
を返しません。どうして?プロローグの巻き戻しリスト
unwindHead([E|Es], F) :- unwinded(E); unwindHead(E, E).
unwinded(L) :- \+ is_list(L).
?- unwindHead([[1]], X).
上記はtrueを返しますが、X
を返しません。どうして?プロローグの巻き戻しリスト
あなたが持っているものは非常に近く、私はあなたがちょうどプロローグでねじれていると思う。最初にそれを論理的に分解してから、Prologを見てください。正しくは、リストの最初の要素自体がリストであるかどうかという点で考えています。その後、我々はE
を取得し、我々は[E|_]
とE
がリストではありません「くつろぎ」場合
[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
).
ノートのようになります
リストですので、_
を使用できます。
'unwindHead'の2番目の引数が* singleton *なので、' X'を何とか統一しません(警告メッセージが表示されました。つまり、1つの場所でのみ使用する変数があるため、使用されていない値で統一されたり、値で統一されることはありません。 – lurker
よろしくお願いします。私はそれをrightideで使用しようとしましたが、結果は同じです:( – Gilgamesz
正直なところ、この述語には一般的に何をしたいかわからない – lurker