2012-10-10 8 views

Antwort

3

UPDATE: Da es nicht erlaubt andere Prädikate zu verwenden, versuchen Sie dies:

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

Die erste Prädikat beschäftigt sich mit dem Basisfall, entfernt der zweite das zweite Element in einer Liste von drei oder mehr Elemente und rekursiv.

+0

'Xs = [f, Xs], erster (Xs) .' ist erfolgreich. Ist das beabsichtigt? – false

+0

@false Ich habe es gerade in SWI versucht, und ich habe 'falsch' zurück. Fehle ich etwas? (Anmerkung: Ich habe meine Antwort bearbeitet, es gab einen Tippfehler in der ersten Zeile - es hieß 'last (X, list)' 'statt' last (X, List) ') – dasblinkenlight

+0

' first (H, H) .' muss sein entfernt. – false

2

Wahrscheinlich meinen Sie, dass das erste und das letzte Element gleich sind. Hier ist eine Lösung mit -Notation:

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

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

Ich bin nicht sicher, ob firstlast([1]) gelingen sollte oder nicht ...

0

Nun, da Sie nur eine Rekursion mit First/1 verwenden kann die Lösung aussehen wird :

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

einige von denen werden die Regeln in Bezug auf die Basisfall und einige von ihnen die Regeln sein, dass „zerfressen“ das Problem. Dieses Problem erfordert eine Überprüfung: Vergleichen Sie das erste und das letzte Element. Also, in Ihrem Basisfall sollten Sie nur diese 2 Elemente haben; Du brauchst nichts anderes. so wird die Lösung all anderen Elemente ignoriert

letzter Hinweis: Sie können Zugriff auf die 2 ersten Elementen einer Liste mit folgenden Vereinigung Muster:

foo([H1,H2|T]) 
0

So schön ich das bekam:

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

Mein Code vergleicht das letzte und erste Element, aber die Rekursion ist einfach falsch:/

Wie oben beantwortet, sollte es nicht erlaubt sein, mit einem Element in der Liste zu enden. Obwohl ich nur das Prädikat "firstlast" verwenden darf.

+2

Dieser Code wäre wesentlich besser sichtbar, wenn Sie ihn der Frage selbst hinzufügen, anstatt ihn als Antwort zu posten. Sie können Ihre Frage jederzeit bearbeiten, indem Sie auf den Link Bearbeiten klicken. – dasblinkenlight