например ..
insert(X,Ys,[X|Ys]).
insert(X,[Y|Ys],[Y|Zs]) :- insert(X,Ys,Zs)
почему использование Zs в качестве переменной .. базовый случай, очевидно, прост .. глава X :: YS.но рекурсивное утверждение будет продолжением первой цели.
поэтому для вставки (a, [b, c], L) вы получаете L = [a, b, c] во второй раз, когда вы получаете [b, a, c] в третий раз, когда получаете [b,c, a]
но каково фактически техническое определение Zs в программе?
[trace] 1 ?- insert(a,[b,c],L).
Call: (6) insert(a, [b, c], _G522) ? creep
Exit: (6) insert(a, [b, c], [a, b, c]) ? creep
L = [a, b, c] ;
Redo: (6) insert(a, [b, c], _G522) ? creep
Call: (7) insert(a, [c], _G595) ? creep
Exit: (7) insert(a, [c], [a, c]) ? creep
Exit: (6) insert(a, [b, c], [b, a, c]) ? creep
L = [b, a, c] ;
Начинается ли продолжение с рекурсивного вызова?Это означает, что первая цель закончилась в базовом сценарии ... поэтому мы начнем в следующий раз @ рекурсивно?Также я вижу начало использования различных переменных местоположений для L (он же _G522 против _G595).