Autor Beitrag
georgeboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Do 26.11.20 15:09 
Hallo zusammen, kann man zwischen SWI Prolog und C#, Dateien mit Strings austauschen ? Ganzzahlen und Flieskommazahlen ? Wenn ich mit SWI einen einen Term, hier String in eine Datei schreibe, kann ich die Datei mit C# lesen ? Und umgekehrt ?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4525
Erhaltene Danke: 932


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 26.11.20 19:28 
C# Kann Dateien schreiben und lesen ja.
Was SWI Prolog kann weiß vermutlich niemand hier bzw. weist du vermutlich selbst am besten. Die Wahrscheinlichkeit das ein Programmiersprache das kann würde ich aber mal als allgemein sehr hoch einschätzen ;)

Ob die dann gegenseitig mit dieser Datei umgehen könne ist wohl eher einen Frage der Formatierung des Inhalts. Die muss man halt an beiden Enden gleich machen.
Als ein Format definieren und an beiden Enden so umsetzen. Bei deinen Beispiel von Zahlen muss man z.B insbesondere auf Kulturabhängigkeit achten und Funktionen zum formatieren benutzen die nicht kulturabhängig sind bzw. eine bestimmte Kultur hart festlegen und nicht vom OS frei entscheiden lassen.
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Fr 27.11.20 07:34 
Möglicherweise kann man Lesen und Schreiben von Strings, von "Hand" machen, man kann einzelne Zeichen, lesen und schreiben. Und Integer und Float nach Strings und umgekehrt mit number_string/2 ...
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Fr 27.11.20 12:11 
Für Strings gibt es: writeln(+Stream, +"MeinString"), und read_line_to_string(+Stream, -Zeile) ...

Moderiert von user profile iconTh69: Code-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4525
Erhaltene Danke: 932


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 27.11.20 12:55 
Da fehlt mir in der Signatur das Handling des Encodings. Möglicherweise kann man das in Prolog aber an dem dort genannten Stream festmachen.
Neben der genannten Absprache der Formatierung muss man natürlich auch das gleiche Encoding an beiden Enden verwenden (und davon abgleitet auch das gleich BOM Handling verwenden).
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Sa 28.11.20 09:37 
Da gibt es das Prädikat encoding/1, als Direktive, die gilt für den Rest der Quelldatei ...
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Sa 28.11.20 12:04 
Was gibt es denn für Möglichkeiten, von C# .NET aus mit SWI Prolog zusammenzuarbeiten ? Meine Idee, ein C# Programm zu schreiben und von diesem SWI Prolog aufrufen, und über Dateien zu kommunizieren. Eine Möglichkeit, vom Autor "Lesta", Prolog einzubinden, klappte bei mir nicht. Leider bin ich mit der GUI Programmierung bei SWI, mit "xpce", nicht zurechtgekommen ...
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4525
Erhaltene Danke: 932


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 28.11.20 13:16 
Du meinst das hier was nicht klappte?

Wenn ich die Doku überfliege und mir den Sourcecode des verlinkten Projekts ansehe und mir überlege warum er dort das tut was er tut fallen die offensichtlichen Möglichkeiten wie p/invoke raus. In dem Code wird per p/invoke mit einer Runtime kommuniziert.
SWI-Prolog ist scheinbar eine Interpreter Sprache oder zumindest eine zwangsweise gejitte Sprache wo man keine klassische Executable oder Dll bekommt?

In der SWI-Prolog Doku wird erwähnt das die Prolog Runtime einen WebServer mitbringt. Ein natürliche Lösung wäre also deine Logik die du scheinbar in Prolog hast als REST API zu veröffentlichen und einen Client zu schreiben der diese API nutzt. Als Client hast du dann alle Möglichkeiten die .Net oder irgendeine andere Programmierumgebung bietet zu benutzen.

Edit: Darüber hinaus kannst du natürlich immer noch schauen welche IPC Mechanismen SWI-Prolog den kann (also so Sachen wie NamedPipes, Sockets und "Ableitungen" davon wie TCP etc.)
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Sa 28.11.20 15:00 
Ich mache das so:

ausblenden C#-Quelltext
1:
2:
3:
ProcessStartInfo theProcess = new ProcessStartInfo("<SWI-Prolog.exe>""-f <Prolog-Code>");
theProcess.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(theProcess);


Erst erstelle ich mit C# die Eingabe-Daten für Prolog, starte Prolog, der <Prolog-Code> arbeitet, erstellt die Ausgabe-Daten, beendet, mit "halt." und C# liest die von Prolog erstellte Ausgabe..

Ist aber unschön, vielleicht gehts schöner ...
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: So 29.11.20 17:37 
Danke Ralf !!!