2012-07-18 21 views
16

Come aggiungere gli elenchi in prolog? Ho cercato in internet e ho trovato questo (da http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html)Come aggiungere gli elenchi in prolog?

append([X|Y],Z,[X|W]) :- append(Y,Z,W). 
append([],X,X). 

Così si ottiene il Z rimuovendo gli elementi di [X|Y] in [X|W]. Ma come posso aggiungere due liste insieme?

Esempio,

appendlist([1,2],[3,4,5],X). 

Il risultato sarà X = [1,2,3,4,5].

Inoltre, non so cosa succede nella ricorsione. (Ho tracciato, ma non ho capito)

EDIT: Quello che voglio sapere è come dovrebbe essere codificato per funzionare come l'accodamento predefinita() in Prolog

risposta

20

Il il codice che hai postato è (quasi) OK. L'ordine delle clausole ha solo bisogno di essere scambiati (in modo da rendere questa definizione predicato produttivo, se usato in maniera generativa):

append([],X,X).       % your 2nd line 
append([X|Y],Z,[X|W]) :- append(Y,Z,W). % your first line 

Questo definisce una relazione tra i tre argomenti, diciamo A, B e C .

La prima riga dice "C è il risultato di aggiungendo A e B se A e C sono liste non vuote, entrambi hanno la stessa testa (cioè primo elemento), e il coda di C è il risultato dell'aggiunta della coda di A con lo stesso secondo argomento, B ".

a  a 
    ---------- 
    b  b 
    c  c 
    . d d 
     e e 
     . . 

Pensaci, ha perfettamente senso. Quello che fa è, vogliamo definire la relazione append/3 e sappiamo cosa vogliamo che sia, quindi scriviamo solo alcuni fatti ovvi su ciò che vogliamo che adempia, le leggi che deve seguire se vuoi.

Quindi, supponendo che abbiamo già definito questo codice per noi, quali leggi deve seguire?Ovviamente, l'aggiunta di una coda di qualche lista con un'altra lista ci dà una coda di risultato di aggiungere l'elenco completo a quella seconda lista.

Definisce il modo in cui "facciamo scorrere" il primo elenco. Ma cosa succede se non c'è altro da far scorrere? E se avessimo raggiunto la fine di quella lista? Poi siamo arrivati ​​alla lista vuota, e aggiungendo una lista vuota con un'altra lista ci dà quella lista come risultato. Ovviamente. E questo è ciò che ci dice la seconda riga del tuo codice, dice, "aggiungendo una lista vuota con un'altra lista produce come risultato".

Sorprendentemente, dopo aver annotato queste due leggi che append/3 deve seguire, equivale a scrivere la definizione stessa.

aggiunta: questo lo spiega da un punto di vista dichiarativo; fare check out an answer by m09 che lo mostra più dal punto di vista operativo.

9

Ma come fare Allego due liste insieme?

È risposto alla tua domanda: È possibile utilizzare append/3.

Se si desidera aggiungere X e Y e memorizzare il risultato in Z, si fa

append(X, Y, Z) 

Se per esempio X = [1, 2] e Y = [3, 4, 5] poi Z sarà legato a [1, 2, 3, 4, 5]:

| ?- append([1,2],[3,4,5], X). 

X = [1,2,3,4,5] 

yes 
| ?- 
+1

Oh, cosa intendo, come faccio a codificarlo che funzionerà allo stesso modo come append() di prolog – Zik

+5

Lo si codifica nello stesso modo in cui 'append' è codificato !? Hai già scoperto l'implementazione (sono le prime due righe di codice nella tua domanda). – aioobe

Problemi correlati