スウィッシュコンソールでこれをトレースします。
% Handover to indenting predicate
isInteger(X) :- isInteger(X,0).
% As isInteger(), with printouts
isInteger(0,I) :- ws(I), format('0 reached\n').
isInteger(X,I) :- wrout('>', X,Y,I), ID is I+1, isInteger(Y,ID), wrout('<', X,Y,I), X is Y+1, wsucc(I).
% Writing out
wrout(C,X,Y,I) :-ws(I),format('~a X=',C),write(X),format(',Y='),write(Y),format('\n').
% Writing "success"
wsucc(I) :- ws(I),format('success\n').
% Indenting by 2*N underscores
ws(0).
ws(N) :- N>0, format('__'), ND is N-1, ws(ND).
2が整数ビアであるかどうかを確認し? - isInteger(2).
ます(ただし、これについてはNextを呼び出さないでください。そうしないと、終わりのない検索が発生します!)
> X=2,Y=_G5707
__0 reached
< X=2,Y=0
__> X=_G5707,Y=_G6473
____0 reached
__< X=_G5707,Y=0
__success
< X=2,Y=1
success
true
を使用して整数を列挙します?- isInteger(I)
0 reached
I = 0
"次"
> X=_G5328,Y=_G5926
__0 reached
< X=_G5328,Y=0
success
I = 1
「次へ」(インデント「__」で再開することに注意してください)
__> X=_G5926,Y=_G391
____0 reached
__< X=_G289,Y=0
__success
< X=_G257,Y=1
success
I = 2
「次へ」(インデント「____」から再開することに注意してください)
____> X=_G391,Y=_G3260
______0 reached
____< X=_G391,Y=0
____success
__< X=_G289,Y=1
__success
< X=_G257,Y=2
success
I = 3
非常に素晴らしい。
これを地元のチームに説明します。これは、いくつかの「元の表記法」を使用した整数列挙プロセスの図です。うまくいけば、自明です。