[Prolog] Dezimal zu Text umwandeln

Heinzi1991

Erfahrenes Mitglied
Also ich hab ja schon ein Thema gepostet, in dem ich ein Prädikat schreiben musste, dass zeilenweise aus einer Datei einlesen kann und in eine Liste speichern kann.

Das hab ich schon geschafft, aber jetzt hab ich das Problem das in meinen Listen keine 1er und 0len stehen sondern die Dezimalzahlen von 0, 1 und dem Leerzeichen, aber ich weiß nicht wie ich das jetzt umwandeln kann, damit der Text wieder da steht.

Ich darf jedes vorprogrammierte Prädikat, dass Prolog versteht verwenden, mir wurde der Tipp gegeben die Prädikate tokenize_atom, nth0, nth1 und maplist könnten helfen, aber ich weiß nicht wie.

Hoffe mir kann jemand auf die Sprünge helfen.
 

Parantatatam

mag Cookies & Kekse
Du kannst doch einfach für jede Ziffer ein Prädikat erstellen, welches als "Eingabe" den Wert als Text und als "Ausgabe" den Wert als Zahl hat:
Code:
convert( "0", 0 ).
convert( "1", 1 ).
Und kannst es dann so anwenden:
Code:
:-? convert( "0", A ).
A = 0;
 

Heinzi1991

Erfahrenes Mitglied
ok schaut eig sehr nice aus, aber wie baue ich das in meinen code ein:

hier ist der code:
Code:
readFile(FileInput, TextList):- open(FileInput, read, Stream),
                                readCharacter(Stream, TextList),
                                close(Stream),
                                !.


readCharacter(Stream,[]):- at_end_of_stream(Stream).    % Exit condition


readCharacter(Stream,[Char|Tail]):- read_line_to_codes(Stream, Char),
                                    readCharacter(Stream,Tail).
 

Parantatatam

mag Cookies & Kekse
Was steht denn jetzt in TextList drin? Das müsste doch eine Liste mit einzelnen Zeichen sein oder täusche ich mich? Kannst Du mal einen Abriss eines möglichen Ergebnisses davon teilen?
 

Heinzi1991

Erfahrenes Mitglied
also ein kleiner teil meines ergebnisses:

Code:
?- readFile('demograph.grf', LSS).
LSS = [[48, 32, 49, 32, 48, 32, 48, 32|...], [49, 32, 48, 32, 48, 32, 49|...],
 

Heinzi1991

Erfahrenes Mitglied
ja aber irgendwie will ich jetzt das am schluss so was steht:

Code:
?- readFile('demograph.grf', LSS).
LSS = [[0, 1, 0, 1,|...], ......

also das die ASCII Zeichen verschwinden und es sollen auch die Leerzeichen "32" verschwinden, es sollen in den Listen nur 1 und 0 drinnen stehen
 

Parantatatam

mag Cookies & Kekse
Leider wusste ich ad hoc nicht, wie man in Prolog eine Zeichenkette in eine Liste umwandelt, aber wenn man die Zeichenkette als Liste vor sich hat, dann geht es beispielsweise so:
Code:
convert_atom( "0", 0 ).
convert_atom( "1", 1 ).
convert_atom( " ", " " ).

convert( [] | [] ).
convert( [ Char | InputRest ], [ Int | OutputRest ] ) :- convert_atom( Char, Int ), convert( InputRest, OutputRest ).
Du musst natürlich auch noch überlegen, was Du mit den Leerzeichen machst. Ich habe es hier so gelöst, dass sie einfach Leerzeichen bleiben. Falls Du sie entfernen willst, gibt es da unterschiedliche Methoden.
 

Heinzi1991

Erfahrenes Mitglied
ok hab es jetzt probiert, aber ich bekomm immer einen "out of local stack" oder einen "out of global stack", wo genau muss ich das prädikat convert einbauen?
 

Parantatatam

mag Cookies & Kekse
Was mich bei Deinem Beispiel wundert, sind zwei Sachen: einerseits sind es mehrere Listen, die wiederum in einer sie umfassenden Liste sind, andererseits der Listenoperator, den Du dort immer vor den drei Punkten hast. Wie kommt die Ausgabe jetzt direkt von readFile/2 ?