メタ述語splitlistIf/3
と具体化された等価述語を使用すると、目前(=)/3
のタスクはワンライナーになります。これは、効率的で論理的に純粋です。
?- splitlistIf(=(#),[#,d,e,#,f,g],Xs).
Xs = [[d,e],[f,g]]. % succeeds deterministically
コードは単調であるため、非常に一般的なクエリでも論理的な健全性が保証されます。
?- Xs = [A,B,C], splitlistIf(=(X),Xs,Yss).
Xs = [A,B,C], X=A , X=B , X=C , Yss = [ ] ;
Xs = [A,B,C], X=A , X=B , dif(X,C), Yss = [ [C]] ;
Xs = [A,B,C], X=A , dif(X,B), X=C , Yss = [ [B] ] ;
Xs = [A,B,C], X=A , dif(X,B), dif(X,C), Yss = [ [B,C]] ;
Xs = [A,B,C], dif(X,A), X=B , X=C , Yss = [[A] ] ;
Xs = [A,B,C], dif(X,A), X=B , dif(X,C), Yss = [[A],[C]] ;
Xs = [A,B,C], dif(X,A), dif(X,B), X=C , Yss = [[A,B] ] ;
Xs = [A,B,C], dif(X,A), dif(X,B), dif(X,C), Yss = [[A,B,C]].