2016-10-13 3 views
1

die Prolog Notation von Präfix/Suffix ist eine ziemlich einfache: Es setzt ziemlich viel Arbeit an append. Für diejenigen, die es nicht wissen:Erhalten Sie "echte" Präfixe/Suffixe/Infixe in Prolog

prefix(P,L):-append(P,_,L). 
suffix(S,L):-append(_,S,L). 

Nun bedeutet dies, dass das Ergebnis für prefix(X,[a,b,c,d]). sein wird: X=[];X=[a];X=[a,b];X=[a,b,c];X=[a,b,c,d]

Hier mein Problem dabei ist: Ich habe einen „echten“ Präfix will. Daher darf ein Präfix nicht leer sein, noch darf der darauf folgende Teil leer sein. So das Ergebnis der Abfrage prefix(X,[a,b,c,d]). sollte

X=[a];X=[a,b];X=[a,b,c] 

sein und das ist es.

Leider ist die wirkliche beaty von der Standard-Einbau Präfix Prädikat ist, dass es die Beendigung des append verwenden kann, das ist append([],Y,Y). So ist es recht einfach ist, zu wissen, wann man aufhören, die Liste zerpflücken eines nach der anderen bis die Liste leer ist.

Mein Abschluss bedeutet: Stoppen Sie, wenn in Ihrer Liste genau ein Element übrig ist. Wie mache ich das?

Mein naives Ergebnis wäre:

prefix(P,L):- 
length(P,1),append(P,E,L),E/=[]. 

Dies obwohl falsch anfühlt. Ich bin bei der Arbeit, also habe ich nicht überprüft, ob das tatsächlich funktioniert, aber es sollte:

Gibt es einen bequemeren Weg, dies zu tun? Das gleiche gilt für Suffix, das wird noch schwieriger, da Sie keine Möglichkeit haben, den Tail so spezifisch wie den Head zu adressieren, ich denke, ich würde einfach das Ganze umkehren und dann das Präfix darauf setzen.

Infix wird nur eine Kombination von zwei sein.

Ich hoffe es ist klar, was ich meine. Danke für deinen Beitrag! tl; dr: Wie schreibe ich ein Prädikatenpräfix/2, das nur echte Präfixe filtert, also darf das Präfix selbst nicht leer sein, noch darf die Liste, auf die es folgt, leer sein.

Antwort

4

Für den echten Präfix, können Sie versuchen, es so zu tun:

list_prefix(List, [H|T]) :- 
    append([H|T], [_|_], List). 

Das sagt nur, dass das erste Argument mindestens ein Element haben muss, und der Rest der Liste muss mindestens eine hat Element.

Und den Vorschlag gefolgt von @False es deutlicher zu machen:

list_real_prefix(List, Prefix) :- 
    Prefix = [_|_], 
    Rest = [_|_], 
    append(Prefix, Rest, List). 

Die „echten“ Suffix wird genau das gleiche:

list_real_suffix(List, Suffix) :- 
    Front = [_|_], 
    Suffix = [_|_], 
    append(Front, Suffix, List). 
+3

keine Notwendigkeit für 'H' und' T' – false

+0

Danke für Ihre Antwort. Ich kann kaum meine Augen offen halten, ich werde bald wieder antworten. Ich muss mich für einen Moment ausruhen - nur um sicherzustellen, dass du dich nicht vergessen fühlst :) – InDaPond

4

Sie auch einen DCG für diesen Einsatz , die beschreibend:

list_prefix(P) --> non_empty_seq(P), non_empty_seq(_). 
non_empty_seq([X]) --> [X]. 
non_empty_seq([X|Xs]) --> [X], non_empty_seq(Xs). 

| ?- phrase(list_pref(P), [a,b,c,d]). 

P = [a] ? a 

P = [a,b] 

P = [a,b,c] 

no 
| ?- 

Sie das Suffix in ähnlicher Weise definieren:

list_suffix(S) --> non_empty_seq(_), non_empty_seq(S). 
Verwandte Themen