bit誌 1986年6月号に戸村哲・小方一郎 両氏による「Prolog in Prolog」と
いう記事があり、そのなかに、
solve(Var,_) :- var(Var),!,fail.
solve( !,V) :- !,cut(V).
solve(true,_) :- !,true.
solve(fail,_) :- !,fail.
solve((A,B),V) :- !,solve(A,V),(var(V),solve(B,V);nonvar(V),true).
solve((A;B),V) :- !,(solve(A,V);solve(B,V)).
solve(P,V) :- functor(P,Functor,Arg),not(predicate_type(Functor/Arg,linear)),!,cal
l(P).
solve(P,V) :- !,clause(P,Q),solve(Q,W),(nonvar(W),!,fail;true).
cut(_).
cut(cut).
という部分があります。私も基本的にこのアイデアを永く拝借してきました。
雑誌のコードには一箇所バグがありました。それから、solve/2の下から
2番目の節は組込述語の場合clause/2がエラーとなるため、その判定を
追加しています。処理系によって判定述語が異なると思います。