valores una rango por otra lista hoja filtro filtrar desplegable datos como celdas avanzado list prolog prolog-dif

rango - filtrar una lista en excel



lista de filtros en listas separadas (3)

Necesito filtrar la lista [#,d,e,#,f,g] obtener la salida como [[d,e],[f,g]] ,
Estoy atrapado al crear una nueva lista cada vez que encuentro ''#'' ¿hay alguna manera de hacerlo? Probé el código a continuación,

filterL([],List) :-[]. filterL([Head|Tail],X) :- ( Head /=''#''-> append(X,Head,List), filterL(Tail,List) ; filterL(Tail,X) ).


Tu problema no está muy bien definido. ¿Se permiten o no las secuencias vacías? ¿Deberá [#] estar relacionado con [[],[]] (hay una secuencia vacía antes y después) o [] ? Usted dice que debería ser [] . Asi que:

list_splitbyhash(Xs, Xss) :- phrase(splitby(Xss,#), Xs). splitby([],_E) --> []. splitby(Xss,E) --> [E], splitby(Xss,E). splitby([Xs|Xss],E) --> {Xs = [_|_]}, all_seq(dif(E),Xs), splitby(Xss,E). all_seq(_, []) --> []. all_seq(C_1, [C|Cs]) --> [C], {call(C_1,C)}, all_seq(C_1, Cs).


Aquí hay otra versión, que utiliza un enfoque aún más general:

list_splitbyhash(Xs, Xss) :- phrase(by_split(=(#), Xss), Xs). =(X,X,true). =(X,Y,false) :- dif(X,Y). by_split(_C_2, []) --> []. by_split(C_2, Xss) --> [E], {call(C_2,E,T)}, ( { T = true }, by_split(C_2, Xss) | { T = false, Xss = [[E|Xs]|Xss1] }, all_seq(callfalse(C_2),Xs), el_or_nothing(C_2), by_split(C_2, Xss1) ). callfalse(C_2,E) :- call(C_2,E,false). el_or_nothing(_) --> call(nil). el_or_nothing(C_2), [E] --> [E], {call(C_2,E,true)}. nil([], []).

Con lambdas , esto se puede expresar de forma más compacta. En lugar de

all_seq(callfalse(C_2),Xs)

y la definición de callfalse/3 , uno ahora puede escribir

all_seq(C_2+/F^call(C_2,F,false))


Con meta-predicate splitlistIf/3 y el predicado de igualdad reified (=)/3 , la tarea en cuestión se convierte en una sola línea, ¡ eso es tanto eficiente como lógicamente puro !

?- splitlistIf(=(#),[#,d,e,#,f,g],Xs). Xs = [[d,e],[f,g]]. % succeeds deterministically

Como el código es monótono , la solidez lógica está garantizada incluso para consultas bastante generales:

?- 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]].