私はこのプロローグ プログラムがどのように機能するかを理解しようとしていますが、初心者の私には多少の困難があります。プログラムは次のとおりです。
initialCan([w, b, w, w, w]).
scholten([X], X).
scholten([X, X | Z], Answer) :- scholten([b | Z], Answer).
scholten([X, Y | Z], Answer) :- scholten([w | Z], Answer).
run(Answer) :- initialCan(L), scholten(L, Answer).
最初のソリューションで実行したトレースを次に示します。
{trace}
| ?- run(A).
1 1 Call: run(_17) ?
2 2 Call: initialCan(_84) ?
2 2 Exit: initialCan([w,b,w,w,w]) ?
3 2 Call: scholten([w,b,w,w,w],_17) ?
4 3 Call: scholten([w,w,w,w],_17) ?
5 4 Call: scholten([b,w,w],_17) ?
6 5 Call: scholten([w,w],_17) ?
7 6 Call: scholten([b],_17) ?
7 6 Exit: scholten([b],b) ?
6 5 Exit: scholten([w,w],b) ?
5 4 Exit: scholten([b,w,w],b) ?
4 3 Exit: scholten([w,w,w,w],b) ?
3 2 Exit: scholten([w,b,w,w,w],b) ?
1 1 Exit: run(b) ?
A = b ?
私が理解に苦しんでいるのは、再帰呼び出しがどのように機能するかです。正確に何が起こるか
scholten([X, X | Z], Answer) :- scholten([b | Z], Answer).
最も紛らわしいのは、[X, X | X] の違いです。Z] および [b | Z]。どんな助けでも大歓迎です。