差分リストの練習 その4

split_at_right。Prologで作る数学の世界―Prologそして集合‐位相‐群の第五章の問題の回答でもある。

バックトラックを利用したもので、Nが小さい場合は効率がよい。現時点で一番prologらしいプログラム。

split_at_right(N, List, Left, Right) :-
        right_sub(List, [Left, []], Right, N), !.
split_at_right(_, List, [], List).
split_at_right_sub([Head | Rest],[Left, Tail], Right, N) :-
        [Left, Appender1] = [[Head | Appender1], Appender2],
        split_at_right_sub(Rest, [Appender2, Tail], Right, N).
split_at_right_sub(Rest, [Tail, Tail], Rest, N) :- length(Rest, N).

ところで

バックトラックで戻った回数を記憶する方法はあるんだろうか。それができればlengthで長さを比較する必要がなくなりさらに効率がよくなるのに。あまり考えなくてよいのだろうか?