2012-02-19 12 views
10

Qualcuno può aiutare a trovare l'errore in questa regola?Concatenazione di elenchi in Prolog

concat([], List, List). 
concat([Head|[]], List, [Head|List]). 
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat). 

La concatenazione di 2 liste fallisce:

| ?- concat([1,2], [4,7,0], What). 

no 

risposta

14

di risolvere il tuo codice, il modo in cui si intendeva, basta a trasformare Head in [Head] nella vostra ultima chiamata per concat/3 nella vostra ultima clausola . Il problema era che hai chiamato il tuo predicato con Head solo come primo argomento, che non è un elenco.

Anche se, qui ci sono diverse note:

  • [Head|[]] è equivalente a [Head]
  • l'algoritmo ha una scarsa complessità, n! Credo.
  • con nessun taglio inserito dopo la seconda clausola, si generano infiniti punti di scelta attraverso la chiamata della terza clausola con un elenco di lunghezza 1 (che quindi chiama la seconda clausola, che quindi viene eseguita attraverso la terza clausola, ecc. . ciclo infinito).

Ecco la versione di SWI-pl, per suggerire voi verso il bene prologo ricorsione:

append([], List, List). 
append([Head|Tail], List, [Head|Rest]) :- 
    append(Tail, List, Rest). 

Potete trovare altre risorse sui recenti post qui o in Learn Prolog Now! esercitazione se si vuole imparare a utilizzare la ricorsione propriamente.

+0

Grazie per l'aiuto. Un'altra domanda: è possibile vedere come il prologo interpreta il programma? ad esempio, la traccia dello stack può aiutare a vedere il problema. – damluar

+3

sì, digita 'trace'. Entrerai nella modalità traccia. Per lasciarlo, scrivi 'notrace'. Sarai in modalità di debug. Per uscire dalla modalità di debug, digita 'nodebug' e tornerai in modalità normale! – m09

+0

Io uso gnu prolog, funziona per me. Grazie! – damluar

4

Si può fare usando append.

concatenate(List1, List2, Result):- 
    append(List1, List2, Result). 

Spero che questo aiuti.

0

Ecco la concatenazione tra regola due liste:

concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3).