先日おもいついた改良案は悪くはなさそうです。
しかし実験してみるとまだ足りないようです。たしかに
成功継続により後続へ変数ポインタは伝達できるようにはなりました。
しかし、制御がうまくいきません。
いつのも例
select1(X,[X|Xs],Xs).
select1(X,[Y|Ys],[Y|Zs]) :-
select1(X,Ys,Zs).
perm1([],[]).
perm1(Xs,[X|Ys]) :-
select1(X,Xs,Zs),
perm1(Zs,Ys).
再帰先のperm1が失敗した場合には直前のselect1にバックトラックします。
ところでそのperm1はというと完全失敗しています。しかしselect1で別解をみつけたらいまいちどperm1へもどってもらわないといけません。この成功継続を温存しておかないと強制バックトラックによりselect1が別解をみつけてもperm1への成功継続が既に失われています。
改良案
perm1のように再帰する述語の場合には失敗継続に印をつけておきます。
ここからバックトラックしてselect1に制御が移った場合にはnpを復元するときに成功継続を1つのこしたnp+1に復元します。そしてperm1の失敗継続に記録された節選択のchoiceをゼロクリアします。
こうするとselect1が深い強制バックトラックをした場合には成功継続で変数ポインタを復元するとともに制御を元にもどし温存してあったperm1への成功継続が起動する。
こんな案を考えています。地球帰還まであと5日か。諦めないでやってみましょう。