>>895 は何も具体的なことをいってない。ちょっと反省して、
といってもCutとは関係ないのですが、
u(1). が定義済みで、
?- u(X),assertz(u(2)).
X = 1;
no
で、つまりassertz(u(2))はこの質問のバックラック時の対象節には
なりません。最初の環境で、
?- repeat,u(X),assertz(u(2)).
X = 1; /* 一回目 u(X) */
X = 1; /* 二回目 u(X) */
X = 2;
X = 1; /* 三回目 u(X) */
X = 2;
X = 2;
X = 2; /* ここまで X = 2 が3個になる */
X = 1; /* 四回目 u(X) */
...
となる。このあたりになると、初心者にはちょっと解りにくい。
Cutの簡単な例を考えていて、唐突に連想した。
考えどころは、u(X) が実行される時の環境が保存されるということ。
repeatへ戻ってからの二回目のu(X)時にはu(2)は今度は定義済みであると
考える。
関数型言語でクロージャが再評価されているようだから、これですんなり
解る人も多いのかも知れない。repeat/0の定義は
repeat.
repeat :- repeat.