1

私はこのプロローグ プログラムがどのように機能するかを理解しようとしていますが、初心者の私には多少の困難があります。プログラムは次のとおりです。

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]。どんな助けでも大歓迎です。

4

1 に答える 1

0

問題のルールは、scholtenが 2 つの同一の要素で始まるリストを見た場合、これらの 2 つの要素を単一の に置き換える必要があることを示していbます。リスト[b | Z]は よりも 1 要素短い[X, X | Z]です。

以下のルールに注意してください

scholten([X, Y | Z], Answer) :- scholten([w | Z], Answer).

シングルトン (つまり、他の場所では使用されない) variable がありますY。ルールを次のように変更する必要があります

scholten([X, Y | Z], Answer) :- X \= Y, scholten([w | Z], Answer).

Xが等しくないことを確認しY、このルールが同じ引数と一致しないようにし[X, X | Z]ます。

于 2013-03-15T01:48:01.670 に答える