2012-10-10 5 views

Odpowiedz

3

UPDATE: Ponieważ nie wolno używać innych predykatów, spróbuj tego:

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

Pierwszy dotyczy predykatywne z przypadkiem bazowym, drugi usuwa drugi element na liście trzech lub więcej przedmiotów i powraca w dół.

+0

'Xs = [f, Xs], firstlast (Xs) .' kończy się sukcesem. Czy to jest przeznaczone? – false

+0

@false Właśnie próbowałem tego w SWI, i dostałem 'false' z powrotem, Czy coś pominęło? (uwaga: redagowałem swoją odpowiedź, w pierwszym wierszu było literówka - powiedziano "last (X, list)" zamiast "last (X, List)') – dasblinkenlight

+0

'first (H, H). 'musi być oddalony. – false

2

Prawdopodobnie oznacza to, że pierwszy i ostatni element są takie same. Oto rozwiązanie przy użyciu -notation:

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

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

Nie jestem pewien, czy firstlast([1]) powinien odnieść sukces lub nie ...

0

Dobrze, ponieważ można używać tylko rekursji z firstlast/1 rozwiązanie będzie wyglądać :

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

niektóre z nich będą dotyczyć zasad odnoszących się do przypadku bazowego, a niektóre z nich, które "zjedzą" problem. Ten problem wymaga jednej kontroli: porównaj pierwszy i ostatni element. więc w twoim przypadku podstawowym powinieneś mieć tylko te 2 elementy; nie potrzebujesz niczego więcej. więc rozwiązanie będzie ignorować wszystkie inne elementy

ostatnia podpowiedź: można uzyskać dostęp do 2 pierwsze elementy listy z następującym zjednoczeniowego wzoru:

foo([H1,H2|T]) 
0

Tak sprawiedliwy mam to:

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

Mój kod porównuje ostatni i pierwszy element, ale rekurencja jest niepoprawna:/

Jak wspomniano powyżej, nie powinno mu się udać z jednym elementem na liście. Chociaż im można używać tylko predykatu "firstlast".

+2

Kod ten byłby znacznie bardziej widoczny, gdyby dodać go do samego pytania, zamiast publikowania go jako odpowiedzi. Zawsze możesz edytować swoje pytanie, klikając link "edytuj". – dasblinkenlight

Powiązane problemy