Stai cercando di rompere gli elementi che sono elenchi in una lista? [chiuso]

0

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.

    
posta Kemo 08.08.2013 - 15:48
fonte

1 risposta

-1

La tua logica è difettosa. La tua funzione first_list_in_the_list cerca una lista vuota o una lista con più di un elemento. L'elenco di elementi viene ignorato.

    
risposta data 08.08.2013 - 16:21
fonte

Leggi altre domande sui tag