2017-12-03 8 views
1

Ich bin sehr neu in Prolog, also nehme an, dass ich sehr wenig Terminologie kenne. Ich benutze Swipl in SWI-Prolog.Prolog: Überprüfen, ob das erste und das letzte Zeichen einer Zeichenkette links und rechts verschnörkelte Klammern sind ('{' & '}')

Ich mag überprüfen, ob eine Zeichenfolge mit einer linken verschnörkelten Klammer beginnt (‚{‘) und endet mit einer rechten verschnörkelten Klammer (‚}‘}

Einig answers, die ich zu Programm führt mich online haben lesen die folgend in meine Wissensbasis zu überprüfen, ob die Zeichenfolge mit einer linken verschnörkelten Klammer beginnen.

start_left_squiggle([Letter|_]):- 
    Letter = '{'. 

Aber wenn ich diese Funktion zu starten, erhalte ich falsch, wenn ich es erwarte wahr zurückzukehren.

?- start_left_squiggle('{hello'). 
false. 

Auch, answers, die scheinen richtig zu prüfen, ob das letzte Zeichen eine quadrige Klammer ist, habe mich dazu gebracht, das folgende zu codieren.

Und ich bekomme wieder falsch beim Ausführen der Funktion, wenn ich erwarte, dass es wahr zurückgibt.

?- end_right_squiggle('hello}'). 
false. 
+0

' 'hallo}'' hier haben Sie nicht zwei geschweifte Klammern am Anfang und Ende, so sollten Sie falsch erhalten . –

+0

@LuaiGhunim Ich führe Tests auf den zwei Funktionen separat durch. Die erste Funktion sollte true zurückgeben, wenn der String mit einem '{' beginnt und die zweite Funktion sollte true zurückgeben, wenn der String mit einem '}' endet. Wofür die Zeichenfolge endet, ist für die erste Funktion irrelevant und für die zweite Funktion ist es irrelevant, womit die Zeichenfolge beginnt. – Jacob

+0

Der einfache Weg besteht darin, die Zeichenfolge in eine Liste umzuwandeln und dann weitere Operationen auszuführen. –

Antwort

1

Das erste, was Sie tun müssen, ist das Atom in Liste von Zeichen wie diese zu brechen:

start_with_left(H):- 
    atom_chars(H,X), %here x is a list 
    X = [L|_], %get the head of the list which is frist element an compare 
    L == '{'. 

Sie eine rekursive Definition verwenden können righ Seite des atom nach Umwandlung des Atoms in überprüfen Liste der Zeichen und wenn die Länge der Liste ist 1 dann vergleichen Sie es mit Klammer, es bedeutet, wenn das letzte Element das gleiche ist, sollten Sie erhalten true sonst False.

Recht ist wie diese, es ist gleich, aber wir brauchen letztes Element, so dass wir die Rekursion verwenden:

start_with_right(H):- 
    atom_chars(H,X), %here x is a list 
    length(X,Y), 
    check_at_end(X,Y). 

check_at_end([H|_],1):- 
    H == '}'. 

check_at_end([_|T],Y):- 
    NewY is Y -1, 
    check_at_end(T,NewY). 

.

+0

In der Zeile 'H == '}',! tun – Jacob

+0

Sie können es entfernen, es wird immer noch funktionieren, es heißt Schnitt und ich kann es nicht in Kommentaren erklären. Ich bearbeite es erneut –

2

Verwenden sub_atom(Atom, Before, Length, After, Subatom) wie so:

?- sub_atom('{abc}',0,1,_,C). 
C = '{'. 

?- sub_atom('{abc}',_,1,0,C). 
C = '}'. 

Oder einfach Test:

?- sub_atom('{abc}',0,1,_,'{'). 
true. 

?- sub_atom('{abc}',_,1,0,'}'). 
true. 
Verwandte Themen