Sto cercando di scrivere un programma che faccia quanto segue:
?- g([2,3, [22,[3],9] ,4,[5],99],X).
X= [2,3,22,[3],9 ,4,5,99]
quindi cerca gli elenchi nell'elenco fornito e lo sostituisce con i relativi elementi senza parentesi [].
quindi ho scritto questo programma:
Il primo blocco cerca solo il primo elemento nell'elenco che è elenco
Se non esiste tale elemento, restituisce [there_is_no_list]
.
first_list_in_the_list([],[there_is_no_list]):-!.
first_list_in_the_list([H|_],X):-is_list(H),X=H,!.
first_list_in_the_list([_|T],X):-first_list_in_the_list(T,X).
Il primo blocco funziona perfettamente in prolog.
Il secondo blocco cerca nella lista un elemento X e poi divide l'elenco in due liste uno è l'elenco di tutti gli elementi prima di X e il secondo è gli elementi dopo X.
splite_when_find_element([H|T],H,[],T):-!.
splite_when_find_element([H|T],X,F,G):-
splite_when_find_element(T,X,F1,G),append([H],F1,F).
funziona anche in Prolog.
e il terzo blocco è append, e unisce due liste insieme in un nuovo elenco.
append([],L,L).
append([H|T],L,[H|U1]):- append(T,L,U1).
e l'ultima parte è:
gg(L,L):-first_list_in_the_list(L,[there_is_no_list]),!.
gg(L,U):-first_list_in_the_list(L,X),
splite_when_find_element(L,X,F,G),gg(G,R),append(F,X,E),
append(E,R,U).
quando fornisco un query [2,[3],5]
ottengo anche [2,[3],5]
e davvero non capisco perché lo faccia.