2012-10-10 22 views

risposta

3

UPDATE: Dal momento che non si è autorizzati ad utilizzare altri predicati, provate questo:

firstlast([H,H]). 
firstlast([F,_|T]) :- firstlast([F|T]). 

La prima predicato con il caso base, la seconda rimuove il secondo elemento in un elenco di tre o più oggetti e ricorre verso il basso.

+0

'Xs = [f, Xs], firstlast (Xs) .' succede. È questo? – false

+0

@false Ho appena provato questo in SWI, e ho ottenuto 'false' indietro, mi manca qualcosa? (nota: ho modificato la mia risposta, c'era un errore di battitura nella prima riga - diceva "last (X, list)" invece di "last (X, List)") – dasblinkenlight

+0

'first (H, H) .' deve essere rimosso. – false

2

Probabilmente vuoi dire che il primo e l'ultimo elemento sono gli stessi. Ecco una soluzione che utilizza -notation:

 
firstlast(Xs) :- 
    phrase(([X],...,[X]), Xs). 

... --> [] | [_], ... . 

io non sono sicuro se firstlast([1]) dovrebbe avere successo o no ...

0

Beh dato che è possibile utilizzare solo un ricorsione con FirstLast/1 la soluzione sarà simile :

firstlast(...) :- ... . 
firstlast(...) :- ... . 
firstlast(...) :- ... . 
.... 
firstlast(...) :- ... . 

alcuni di questi saranno le regole per quanto riguarda il caso base e alcuni di loro le regole che "erodere" il problema. questo problema richiede un controllo: confronta il primo e l'ultimo elemento. quindi, nel tuo caso base dovresti avere solo questi 2 elementi; non hai bisogno di nient'altro quindi la soluzione ignorerà tutti gli altri elementi

ultimo suggerimento: è possibile accedere alle 2 primi elementi di una lista con il seguente modello di unificazione:

foo([H1,H2|T]) 
0

Così fiera ho ottenuto questo:

firstlast([H,_|T]) :- 
(T1 = H, T1 = T) -> firstlast([H|T]). 

Il mio codice confronta l'ultimo e il primo elemento ma la ricorsione è semplicemente errata:/

Come indicato sopra, non dovrebbe essere consentito il successo con un elemento nell'elenco. Sebbene sia permesso solo usare il predicato "firstlast".

+2

Questo codice sarebbe molto più visibile se lo aggiungi alla domanda stessa, piuttosto che pubblicarlo come risposta. Puoi sempre modificare la tua domanda cliccando sul link 'edit'. – dasblinkenlight

Problemi correlati