Concatting eine Liste von strings in Prolog
Schreibe ich ein Lisp-C übersetzer und ich habe ein problem mit der Handhabung von strings. Dies ist ein code, verwandelt eine einfache Lisp-Funktion, um ein C-äquivalent:
define(F) --> fun_unary(F), !.
fun_unary(F) --> "(define (", label(Fun), spaces, label(Arg1), ")", spaces, expr(Body), ")",
{swritef(F, "data *%t(data *%t) { return(%t); }", [Fun, Arg1, Body])}, !.
funs([F]) --> define(F), !.
funs([F|Fs]) --> define(F), spaces, funs(Fs), !.
Nun will ich Lesen, eine beliebige Anzahl von Funktionen auf und schickt Sie als einen einzigen string. Die oben funs
ist das beste, das ich kommen könnte, aber es funktioniert wie folgt:
?- funs(F, "(define (carzero l) (= (car l) 0)) (define (zero n) (= 0 n))", []).
F = ["data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }", "data *zero(data *n) { return(eq(make_atom_int(0), n)); }"].
Während ich etwas wie dieses:
F = "data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }\n\ndata *zero(data *n) { return(eq(make_atom_int(0), n)); }".
so, dass ich schön swritef
ist in ein komplettes Programm, zwischen #include
s und main(). Eine alternative Lösung ist das ändern der höchsten Ebene übersetzer, um mit der Liste arbeiten. Es curently sieht wie folgt aus:
program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.
Wie würde ich diese zwei? Ich verwende SWI-Prolog.
- Die Betreff-Zeile erwähnt, Prolog, während der Körper von der Frage fragt nach "Lisp nach C" übersetzung. Helfen Sie mir, Sie zu Sortieren, was was ist hier. Der code-Schnipsel schauen ein wenig wie der Prolog, vielleicht, weil die spezielle DCG-syntax verwechselt wird mit Prolog mehr in der basic-syntax für die Regeln. Während die Betreff-Zeile, fragt etwa "eine Liste von Zeichenketten in Prolog", es scheint, Parsen von strings, die Lisp-code beteiligt ist. Verkettung einer Liste von strings ist eine relativ einfache Aufgabe in Prolog. Dein Beispiel predicate funs/2 schlägt Sie möchten, werfen in ein paar neue-Zeile-Zeichen zwischen...
- ...aufeinander folgenden Zeichenfolgen verkettet. Wenn das den Umfang der Frage kann ich beantworten, und wir können uns Sortieren, die Verwirrung in der Syntax (falls erforderlich).
- Lisp nach C übersetzen ist, was das Programm macht. Das Programm ist geschrieben in Prolog, mit der DCG-syntax zu übersetzen Einzelfall. Die meisten ausgesagt analysieren Lisp-code, mit Ihrer Argumentation die daraus resultierende C-code. Ich möchte zwei Zeilenumbrüche zwischen verkettet Zeichenfolgen. Hoffe, das ist es.
- Also die Lisp-to-C-übersetzung Teil war nicht wirklich Teil der Frage 🙂 Coole Idee, obwohl. Wie gehst du mit der Speicher-Aufteilung?
- Wenn ich wusste, dass der spezifische Prolog-Implementierung, die Sie verwenden, die ich anpassen könnte die Antwort sein. Es gibt drei Darstellungen von "strings" gemeinsam Prolog: strings, Atome und Listen von Zeichen. Die ISO-Norm sagt lese - /1 und die zugehörigen Prädikate behandeln sollten, Doppel-zitierten text als strings, sondern weil der historische Unterstützung für diese syntax zu bezeichnen Listen von Zeichen, Implementierungen in der Regel mit dem Thema beschäftigen Optionen mit unterschiedlicher syntax.
- Ich habe gerade
malloc
Raum für jede variable. So weit, nur#t
und()
nur einmal initialisiert werden und ich Speicherplatz für jede Zahl, jedes mal, wenn es verwendet wird, aber ich Plane zu halten, eine Liste von zahlen, sind schon reserviert und diese wiederverwenden, wenn notwendig (durchassert
, wahrscheinlich).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beiseite für jetzt, für welchen Zweck es benötigt wird, schreiben Sie ein Prolog-Prädikat, verkettet eine Liste von strings zu einem string zusammen, indem er einen doppelten Zeilenumbruch zwischen jedem aufeinander folgenden paar von strings (aber nicht am Ende der Ausgabe-string, die Beurteilung durch das Beispiel, die Jerry gepostet).
SWI-Prolog-Manual: Normalerweise hätte ich den post "deep" links zu die Dokumentation, aber der SWI-Prolog-site verwendet einen Stil, der URL, die Trigger cross-site-scripting (XSS) - Warnungen mit vielen browser/plugin-Kombinationen. Also, stattdessen werde ich finden Sie als link auf den entsprechenden Abschnitt.
Abschnitt 4.22 Vertretung der text in Zeichenfolgen sagt (teilweise), "String-Objekte sind standardmäßig haben keine lexikalische Darstellung und kann somit nur geschaffen werden, mit Hilfe der Prädikate, die unter oder über der "foreign language interface". Dies kann ein wenig verwirrend sein, da SWI-Prolog schreibt strings in doppelten Anführungszeichen den text, sondern liest double-quoted text (standardmäßig) als Listen von Zeichen-codes.
Hier ist code für ein Prädikat, verkettet die Zeichenfolgen in einer Liste, einfügen einer anderen Zeichenfolge Trennzeichen zwischen aufeinander folgenden string-Paare:
Beachten Sie, dass wir definiert haben zwei Prädikate, strSepCat/3 und strSepCat/4. Das erstere ist definiert in Bezug auf die letztere, ein typisches design-Muster in Prolog, stellt ein zusätzliches argument als ein Akkumulator, der an einen Ausgang, wenn die Rekursion abgeschlossen ist. Eine solche Technik ist oft hilfreich, um ein tail-rekursive definition.
Das Prädikat strSepCat/3, wir würden in der Regel konstruieren müssen, der separator-string mit (escape-Sequenz) zwei neue Zeilen:
Was über die Verwendung von DCG-notation für Anhängen des strings?
Da die Saiten im Prolog sind wirklich Listen von Zeichen-codes, die Sie verwenden können
append
in ein benutzerdefiniertes Prädikat, die auch fügt die Zeilenumbrüche:Verwendung:
F = ["data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }", "data *zero(data *n) { return(eq(make_atom_int(0), n)); }"], concat_program(F,X).
funktioniert. Ich kann nicht sehen, was falsch in der rest des Codes, da haben Sie noch nicht die ganze Grammatik.append
mitconcat
oderstring_concat
zu sehen, ob das funktioniert.