С метапредикатом 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]].
person
repeat
schedule
15.05.2015
%
— это комментарий, поэтому используйте кавычки, например['%',d,e,'%',f,g]
. - person false   schedule 18.10.2014List
в первом предложении не имеет никакого смысла. Вероятно, вам нужен предикат арности 3, а не 2. В Прологе нет операторов возврата. - person false   schedule 18.10.2014[]
,[#]
,[#,#]
,[#,#,#]
... все дают[]
? - person false   schedule 18.10.2014