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.
Oh, cosa intendo, come faccio a codificarlo che funzionerà allo stesso modo come append() di prolog – Zik
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