2017-04-15 5 views
4

Ich muss eine Hausaufgabe lösen, aber ich habe nur sehr begrenzte Kenntnisse von Prolog. Die Aufgabe ist folgende:
Schreiben Sie ein Prolog-Programm, das alle Teilzeichenfolgen einer Zeichenfolge auflisten kann, deren Länge mindestens zwei Zeichen beträgt und das erste und letzte Zeichen identisch ist.Alle Teilstrings mit demselben Anfang und Ende

Zum Beispiel:

?- sameend("teletubbies", R). 
R = "telet"; 
R = "ele"; 
R = "eletubbie"; 
R = "etubbie"; 
R = "bb"; 
false. 

Mein Ansatz für dieses Problem ist, dass ich mit Kopf/Schwanz über den String iterieren sollte und den Index des nächsten Buchstaben finden, die die gleiche ist wie der Strom (es genügt die mindestens 2-Längen-Anforderung) und schneidet die Teilkette mit sub_string Prädikat.

+0

einfach ist, können Sie Ihren aktuellen Ansatz zeigen? –

+0

Es war nur eine Idee, aber im Code könnte es vielleicht so aussehen: sameend ([H | T], R): - sameend ([T], R),% und es sollte wieder ein rekursiver Aufruf stattfinden wo das gleiche Zeichen ist und dann sub_string() von H's Position zu seinem nächsten Vorkommen. –

Antwort

3

Das hängt ein bisschen davon ab, was Sie genau mit einer Zeichenkette meinen. In Prolog ist eine Zeichenfolge traditionell eine Liste von Zeichen. Um sicherzustellen, dass Sie diese wirklich erhalten, verwenden Sie die folgende Richtlinie. Siehe this answer für mehr.

:- set_prolog_flag(double_quotes, chars). 

sameend(Xs, Ys) :- 
    phrase((..., [C], seq(Zs), [C], ...), Xs), 
    phrase(([C], seq(Zs), [C]), Ys). 

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

seq([]) --> 
    []. 
seq([E|Es]) --> 
    [E], 
    seq(Es). 
0

wenn Ihr Prolog/2 und letzten/2 in der Bibliothek anhängen hat (lists), als

sameend(S,[F|T]) :- 
    append([_,[F|T],_],S),last(T,F). 
Verwandte Themen