Autor |
Beitrag |
georgeboy
Beiträge: 214
|
Verfasst: Di 27.09.22 16:21
Hallo zusammen, mal wieder. In letzter Zeit beschäftigt mich immer wieder ein Thema. Könnte man den nicht in einer kleinen Teilmenge einer natürlichen Sprache programmieren ? Die Frage: gibt es sowas schon ? Und wenn ja welche ? Momentan ist es sehr interessant, möchte aber das Rad nicht zweimal erfinden. Hier ein Beispiel, wohlgemerkt Quelltext, einer fiktiven Sprache:
Text: Ein Auto hat 4 Räder. Es gibt 10000 Autos. Wieviel Räder gibt es ? // Muss nicht stimmen
Meta: Wenn ein Objekt N Teilobjekte hat, und es M Objekte gibt, dann gibt es N * M Teilobjekte.
Durch Einsetzen der Textzeile ( nach Textumformung ) in die Metazeile erhält man das Ergebnis: Es gibt 40000 Räder.
Wenn man Handlungsanweisungen einbauen möchte, kommt man immer wieder auf die Sprach-Konstrukte existierender Programmiersprachen zurück. Also nichts Neues. Hättet Ihr Ideen wie man so eine Sprache gestalten könnte ? Mit wenig Sprachelementen, mit Relationen wie: "ist ein", "hat", "es gibt" und "für Alle" ? Compilerbau ist nicht das Problem. Es geht auch nicht darum die Schlüsselworte von C# ins Deutsche zu übersetzen, irgendeine Besonderheit sollte die Sprache schon haben. Sowie Prolog oder Lisp eigenständige Konzepte als Grundlage haben. Gut um "FürAlleTue:" kommt man wohl nicht herum, oder ?
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Di 27.09.22 21:22
Guck dir mal die beiden Programmiersprachen "ArnoldC" und "Shakespear" an.
Vielleicht findest Du da Inspiration.
|
|
georgeboy
Beiträge: 214
|
Verfasst: Mi 28.09.22 16:27
Danke, Palladin007 ! Womöglich braucht man das garnicht, heutige Programmiersprachen sind auch sehr angelehnt an die natürliche Sprache, da gibt es if then else für Wenn dann sonst usw. War nur etwas euphorisch, weil das obige Beispiel funktioniert.
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 28.09.22 16:54
Zitat: | heutige Programmiersprachen sind auch sehr angelehnt an die natürliche Sprache, da gibt es if then else für Wenn dann sonst usw |
Das ist/wär für mich der entscheidende Punkt. Es ist "angelehnt" aber es ist keine natürliche Sprache. Natürliche Sprache lebt von Variation, Konotation und Redundanz alles was ich in einer Programmiersprache eher nicht will da ist Eindeutigkeit das entscheidende Kriterium.
Das was ich als natürliche Sprache bei einer Programmiersprache verstehen und akzeptieren könnte wäre etwas das ich nicht in einen Compiler schieben würde sondern in eine AI die daraus dann was zaubert.
Du kannst aber mal versuchen deine potentielle natürliche Programmiersprache als BNF auszudrücken um übliche Programmierkonstrukte darzustellen und dann sehen ob das funktioniert. Möglicherweise wirst du dann, wenn du das Ergebnis mit den BNFs anderer Programmiersprachen vergleichst, feststellen das du nur Schlüsselwörter getauscht hast. Und dann wirst du festsstellen das du möglicherweise eigentlich ein anderes Programmierkonzept möchtest jenseits von strukturiert, objektorientiert, funktional etc. und dann im Anschluß überlegen ob sich für dieses Konzept eine speziell geartete "natürliche" Sprache eignet. Zum Beispiel viele funktionale Programmiersprachen sind in meinem Augen ja eher nicht "natürlich" sonder eher an einer mathematischen Sprache orientiert weil das besser passt.
|
|
georgeboy
Beiträge: 214
|
Verfasst: Do 29.09.22 08:29
Meine Idee ist, das die neue Natürliche PS (NPS), (nur eine Bezeichnung) als Datenstrukturen nur natürlichsprachliche Sätze hat. Aus vorhandenen Sätzen werden neue gebildet, sowie oben als Beispiel. Aber um Sprachelemente wie "if Bedingung then Action" kommt man nicht herum, sind aber eigentlich auch natürliche Sprachelemente. Strukturiert wäre die NPS schon, einen konkreten Entwurf, habe ich noch nicht. Momentan brauch ich ein Sprachelement wie "Vielfachheiten oder Collections, Arrays oder Listen", die aber selber auch Sätze sein müssen, um die Einheitlichkeit zu bewahren. War ein wenig euphorisch wegen dem obigen Beispiel. Man kann sich hohe Ziele, setzen danach Abstriche machen, oder es ganz verwerfen. Es geht jetzt um Iteration und Rekursion, alles mit Sätzen ...
0
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.09.22 10:04
Das Problem ist, dass natürliche Sprache nicht für kompakte, eindeutige und strukturierte Ausdrucksweisen ausgelegt ist. Man hätte daher nicht nur die genannten Probleme bei der Interpretation, sondern zusätzlich auch deutlich längere und unübersichtlichere Quelltexte. Das sieht man ja auch schon an deinem Eingangsbeispiel.
Dazu kommt, dass die Interpretation der Inhalte natürlicher Sprachen schon lange durch künstliche Intelligenz durchgeführt wird, mehr oder weniger erfolgreich. Das hat im Grunde den gleichen Zweck wie ein Compiler, wenn man es aus der Sicht einer Programmiersprache betrachtet.
Wenn man zur Theorie von Programmiersprachen kommt, kommt man dann auch unweigerlich zur Turing-Vollständigkeit. Die dürfte durch annähernd natürliche Sprache kaum zu erreichen sein.
Je mehr man dann von natürlicher Sprache abweicht, um die Notwendigkeiten einer Programmiersprache abzudecken, desto näher kommt man (wie Ralf schon geschrieben hat) aktuellen herkömmlichen Programmiersprachen...
Dazu kommt dann die Erlernbarkeit (was kann ich wie machen?) und damit verbunden die Unterstützung moderner IDEs durch Syntaxergänzung usw., die bei annähernd natürlicher Sprache kaum möglich sein dürfte.
|
|
georgeboy
Beiträge: 214
|
Verfasst: Do 29.09.22 10:22
Also die Quelltexte wären in der Tat viel länger. Aber von der Mächtigkeit wäre die NPS gleich wie C#, Prolog oder Lisp. Der Vorteil, man kann ein Programm-Vorhaben viel einfacher in einen Programm-Quelltext umsetzen, man bräuchte nicht mal eine heutige PS erlernen. Ausserdem wäre ein NPS-Programm auch eindeutig. Ich weiss, dass es in der KI-Forschung Spracherkennung gibt, aber ob die KI eine natürlichsprachliche Programmiersprache anbietet, davon weiss ich jedenfalls nichts. Umgekehrt könnte man NPS für KI-Vorhaben einsetzen. Aber das ganze habe ich noch nicht fertig, ob es geht werde ich sehen ...
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 29.09.22 10:56
Zitat: | Der Vorteil, man kann ein Programm-Vorhaben viel einfacher in einen Programm-Quelltext umsetzen, man bräuchte nicht mal eine heutige PS erlernen. |
Das halte ich für einen Denkfehler - beides.
Einfacher ist es nur für jemanden, der noch keine Programmiersprache kann.
Alle anderen vermutlich genervt davon, weil natürliche Sprache eben nicht nur deutlich komplexer ist, sondern auch Variationen enthält und immer anders interpretiert werden kann und wird.
Und lernen muss man das natürlich immer noch.
Man muss sehr genau wissen, welche Formulierung zu welchem Verhalten führt und da die Sprache an sich deutlich komplexer ist, als gängige Programmiersprachen, muss man auch mehr Variationen lernen.
Und dann vergisst Du, dass es auch noch sehr komplexe Konstrukte gibt, sowas wie asynchrone Programmierung oder so ziemlich alles im Security-Umfeld.
Am Ende ist so eine Programmiersprache eben immer noch nur eine Programmiersprache und der Code dazu muss in einer bestimmten Weise geschrieben sein, dass das Programm auch das tut, was es soll. Mit der natürlichen Sprache machst Du sie nur deutlich komplexer, als gängige Programmiersprachen und mit der KI zur Spracherkennung fügst Du noch eine großen Faktor hinzu, den Du nicht vollständig kontrollieren kannst.
|
|
georgeboy
Beiträge: 214
|
Verfasst: Do 29.09.22 11:18
Also, bei NPS geht es nur um eine kleine Teilmenge der natürlichen Sprache. Selbsterklärend, und eindeutig, ohne Varianten ! Ausserdem kann es die Grundlage von syntaktischen Anfragen sein. Im Internet gibt man vorwiegend einzelne Wörter ein, wünschenswert wäre es, als Anfrage ganze Sätze einzugeben ( vielleicht über ein Mikrofon ), die dann genau beantwortet werden, ohne 20000 Treffer. Das Ganze ist ein Missverständnis, weil ich hier noch nicht erklärt habe, wie ich mir das vorstelle, Reden wir weiter, wenn das ganze fertig ist ...
Ein weiteres Beispiel:
Text: Sei Auto ein Objekt. Seien Autos das Plural von Auto.
Sei Lenkrad ein Teilobjekt von einem Auto.
Die Farbe eines Lenkrades kann sein: schwarz, grau.
Sei Auto1 ein Auto, mit schwarzem Lenkrad.
Sei Auto2 ein Auto, mit grauem Lenkrad.
Füge den Autos Auto1, und Auto2 hinzu.
Für alle Autos tue: ...
Das Ganze ist deklarativ, und logisch, und natürlich!
Selbstverständlich kann man das Alles auch mit C# machen. Auch kürzer und auch selbtserklärend ! Ich finde mein NPS eben schöner !
Wahrscheinlich kommen wir da nicht weiter, dann beenden wir das eben ...
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 29.09.22 11:54
Zitat: | Im Internet gibt man vorwiegend einzelne Wörter ein, wünschenswert wäre es, als Anfrage ganze Sätze einzugeben ( vielleicht über ein Mikrofon ), die dann genau beantwortet werden, ohne 20000 Treffer. Das Ganze ist ein Missverständnis, weil ich hier noch nicht erklärt habe, wie ich mir das vorstelle, Reden wir weiter, wenn das ganze fertig ist ... |
Das klingt jetzt nach etwas das ChatBots tun. Vieleicht lohnt es sich für dich auch da mal reinzusehen. Wobei die das Problem mit der schweren Eindeutigkeit durch Rückfragen lösen also eher nicht das was du willst aber das erkennen von Schlüsselwörtern ignorieren von reinen bedeutungslosen Füllwörtern (eine Eigenschaft natürlicher Texte ist das sie voll von Füllwörtern sind die keinerlei Wert haben ausser aus der Informations eine aussprechbaren Satz zu machen) etc sollte alles hilfreich sein.
|
|
georgeboy
Beiträge: 214
|
Verfasst: Do 29.09.22 13:05
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.09.22 13:52
georgeboy hat folgendes geschrieben : | Also, bei NPS geht es nur um eine kleine Teilmenge der natürlichen Sprache. Selbsterklärend, und eindeutig, ohne Varianten ! |
Das ist ein Widerspruch in sich. Wenn nur eine kleine Teilmenge nutzbar ist, muss der Nutzer diese auch kennen. Entsprechend kann das nicht ohne Vorkenntnisse, sprich selbsterklärend, funktionieren.
|
|
georgeboy
Beiträge: 214
|
Verfasst: Do 29.09.22 13:57
Selbstverständlich muss ein Nutzer die eingeschränkte Sprachmenge kennen, sowie man bei C# die Schlüsselworte auch lernen muss ! Die Programme an sich sind selbsterklärend. Lese mal mein letztes Beispiel, das versteht man sofort.
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 29.09.22 14:28
Das Beispiel beschreibt ein Programmiersprachen Problem (Definition von Dingen) im Folgen warst du aber bei Anfragen an Suchmachinen also eher eine "Query Language" als Ziel was du vor Augen hast.
Da sind glaube ich 2 Dinge die schwer zusammenzubringen sind oder anders gesagt es wären 2 verschiedene Untermengen von natürlicher Sprache.
So wie C# schon konzeptionell anders aufgebaut ist wie SQL. Da brauch man unterschiedliche Ansätze.
Natürliche Sprache ist da bedingt passend. Es wäre eher was wie bringe ich etwas das boolscher Algebra(auch eine Sprache) entspricht in eine Form für jemand der natürliche Sprache kennt(jedermann) aber eben keine Idee von boolscher Algebra hat.
Da wäre dann jetzt die Gegenfrage sucht du eher eine Sprache passend für Programmierung(also Beschreibung von Algorithmen) oder doch eher wie ich zuletzt vermutet um Abfragen auzudrücken(also eher zur Beschreibung eines Ergebnisses das man erwartet)?
|
|
georgeboy
Beiträge: 214
|
Verfasst: Do 29.09.22 15:26
Es soll eine Programmiersprache werden. Mit Sprachelementen wie: "Wenn dann sonst", "solange Bedingung tue:" und kein SQL oder LINQ bei C#. Und die Sprache soll leicht zu lesen sein, deklarativ, mit Vererbung, den Schlüsselwörtern : "hat", "istein", "von" usw. Wollte es früher "Von-Sprache" nennen. Jetzt weiss ich auch nicht ob diese NPS lange Quelltext haben wird. Übertragt mal mein letztes Beispiel auf C#: Da braucht man: Eine Aufzählung: FarbeVomLenkrad 5 Zeilen. Eine Klassen-Definition für die die Klasse: Auto 7 Zeilen. Dann eine zusätzliche Klasse: Autos: Mit: List<Auto> autos = new List<Auto>(); nochmal 5 Zeilen. Die genaue Anzahl der Zeilen ist hier unwichtig. Es könnte also sein. dass NPS auch nicht längere Quelltexte hat ,als zB: C#. Momentan beschäftigt mich eines: Die Datenstrukturen sollen alle natürlichsprachliche Sätze sein. Aus vorhandenen Sätzen sollen neue abgeleitet werden können. Jetzt möchte ich auch Iteration oder Rekursion ermöglichen. Die Daten die verarbeitet würden, müssen alle Sätze sein, um die Einheitlichkeit nicht zu verletzen. Ich brauche also "Collections" die aus Sätzen bestehen. Meine Idee ist ein NPS - Wort "VerknüpftMit" einzuführen um die Daten ( Collections, also Array, Listen usw ) als Sätze zu formulieren: 1 VerknüpftMit 2 VerknüpftMit 3 VerknüpftMit Ende.
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 29.09.22 16:24
Wenn ich dein Beispiel mal grob nach C# übersetze:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public class Auto { public Color LenkradFarbe { get; }
public Auto(Color lenkradFarbe) { LenkradFarbe = lenkradFarbe; } }
List<Auto> autos = new() { new Auto(Color.Black), new Auto(Color.Gray), }; |
Das sind minimalste Anforderungen.
Was machst Du mit komplexeren Dingen, wie verschachtelte Bedingungen, verschachtelte Schleifen, Rekursion, Callbacks, async, etc.
Oder wie bringst Du Datenbank-Abfragen unter? Wenn es natürliche Sprache bleiben soll, müsstest Du plötzlich auch noch SQL irgendwie unterstützen. Oder soll das dann ein in einer ewig langen Zeile geschriebener String in Anführungszeichen sein?
Und generell: Welche Möglichkeiten gibt es, den Code so umzuformatieren, damit er übersichtlicher wird? In C# gibt's massig Wege, den gleichen Code zu schreiben.
Für einfachste Programme mag das vielleicht irgendwie noch funktionieren, aber sobald es komplexer wird, bricht das zusammen.
Am Ende hast wieder nur eine ganz normale Programmiersprache, mit dem mehr oder weniger gleichen Aufbau, allerdings:
- Deutlich unübersichtlicher, weil Du am Ende die gleichen Kontroll-Strukturen brauchst, nur dass Du dafür teils mehrere Worte benötigst, die - für einen korrekten Satzbau - auch nach variieren können
- Deutlich komplexer, weil normale Sprache gut mit komplexen Zusammenhängen umgehen kann (man braucht mehrere Sätze oder ausführliche Erklärungen)
- Deutlich umfangreicher, weil Du mehr Text für das Gleiche brauchst
Außerdem wäre sie international schlechter einzusetzen.
Bei Kommentaren oder so beim Reden kann man Sprachbarrieren überwinden, aber wenn auch noch der Quellcode den gleichen Regeln der gesprochenen Sprache folgt, dann kannst Du nicht mehr umschreiben.
Klar, irgendwie geht das und mit der Zeit lernt man die Sprache auch, aber die Hürde ist größer, während bei den "normalen" Programmiersprachen Struktur und Verständnis immer gleich sind, egal wo man her kommt.
Wenn Du mit natürlichen Sprachen entwickeln willst, holst Du unser Sprachzentrum mit ins Boot und das denkt je nach Herkunft anders - sogar im gleichen Land.
Außerdem fehlen dir optische Orientierungspunkte im Code.
Unser Gehirn mag es, optisch immer einheitliche Punkte zu suchen und orientiert sich daran.
Das macht es leichter, den Überblick zu behalten und den Code zu verstehen.
Bei C# weiß man bei einer geschweiften Klammer direkt: Das ist ein Scope, aber wie sieht das bei deiner Idee aus?
Dafür gibt es in natürlichen Sprachen ja Punkt-Aufzählungen, Absätze, Einrückungen, etc., weil sonst jeder den Überblick verlieren würde.
|
|
Blup
Beiträge: 174
Erhaltene Danke: 43
|
Verfasst: Do 29.09.22 16:30
georgeboy hat folgendes geschrieben : |
Text: Sei Auto ein Objekt. Seien Autos das Plural von Auto.
Sei Lenkrad ein Teilobjekt von einem Auto.
Die Farbe eines Lenkrades kann sein: schwarz, grau.
Sei Auto1 ein Auto, mit schwarzem Lenkrad.
Sei Auto2 ein Auto, mit grauem Lenkrad.
Füge den Autos Auto1, und Auto2 hinzu.
Für alle Autos tue: ...
|
Schon hier wird deutlich das natürlich Sprache zu Uneindeutigkeit führt.
Sind Auto, Auto1, Auto2 jeweils ein Objekt(Instanz) oder eine Klasse?
Ist Autos eine Klassentyp oder eine Liste von Auto-Objekten?
Ist Farbe ein Attribut das dem Objekt Lenkrad jederzeit zugewiesen werden kann oder sind das zwei verschiedene Klassen von Lenkrädern (mit einem festen Klassenatribut).
Fragen über Fragen ...
|
|
georgeboy
Beiträge: 214
|
Verfasst: Do 29.09.22 17:07
Palladin007, womöglich hast Du in jedem Punkt recht. Ich bin auch damit erst am allerersten Anfang. Wenn ich damit Erfolg haben möchte, dann muss eine Sprachtransformation möglich sein. An dem Grundkonzept, nur Sätze in andere zu verwandeln, möchte ich festhalten. Übrigens bei meinem letzten Beispiel kann man das Wort Farbe natürlich in C# mit Color hinschreiben, bei anderen Eigenschaften muss man doch eine selbstdefinierte Aufzählung verwenden. Und verschachtelte Iteration bzw Rekursion ist wohl damit auch zu machen. Alles was man irgendwie in natürlichsprachliche Ausdrücken fassen kann, könnte man bei NPS verwenden. Hast Du meinen letzten Beitrag die Sache mit den Collections gelesen ? Die deutsche Grammatik unterscheidet sich von der englischen. Dann müsste man eben als natürliche Sprache Englisch nehmen, keine grosse Umstellung, weil es nur wenig Schlüsselworte wären. Es sollte NPS ein eigenständiges Konzept haben. Bei Prolog das logische, bei Lisp das funktionale, bei C# das imperative, und bei NPS eben das syntaktische. Ich glaube nicht, dass man an der Stelle schon über Erfolg oder Misserfolg entscheiden kann. Entweder es klappt, oder nicht. ein Versuch ist es wert ! Bei Prolog geht die Rekursion mit Unifikation, auch ganz anders wie bei C# ! bei NPS müsste man suchen. ob es sich dafür ein eigenständiges Konzept finden lässt.
|
|
georgeboy
Beiträge: 214
|
Verfasst: Do 29.09.22 17:13
Blub, von Klassen ist hier nicht die Rede, keine Objektorientiertheit. Der Begriff Objekt ist hier umgangssprachlich verwendet. Natürlichsprachlich ! Eine Uneindeutigkeit dürfte es da selbstverständlich nicht geben. Bei "Sei Auto ein Objekt" natürlichsprachlich, kommt es zu keiner Mehrdeutigkeit ! Ist nur wichtig für Meta-Sätze wie "Wenn O ein Objekt ist dann ..."
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 29.09.22 17:34
Meine "Übersetzung" war nur meine Interpretation davon, um zu zeigen, dass das quasi nichts ist.
Du hast so viel Code ohne jede Übersichtshilfe für ein so minimalistisches Beispiel - jedes Programm toppt die Komplexität um ein Vielfaches
Zitat: | von Klassen ist hier nicht die Rede, keine Objektorientiertheit. Der Begriff Objekt ist hier umgangssprachlich verwendet. |
Zitat: | Sei Lenkrad ein Teilobjekt von einem Auto. |
Und was soll dann ein "Teilobjekt" sein?
Wenn irgendetwas ein Teil von etwas Anderem sein kann, hast Du zwangsläufig ein Objekt mit Eigenschaften.
Dann wäre das halt schwach typisiert, wie in JavaScript.
Aber Du kannst es natürlich ausprobieren, möglich ist alles.
By the way:
Zitat: | Dafür gibt es in natürlichen Sprachen ja Punkt-Aufzählungen, Absätze, Einrückungen, etc., weil sonst jeder den Überblick verlieren würde. |
Wäre schon, wenn Du Gebrauch davon machst
Diese Eine-Zeile-Aufsätze sind echt anstrengend zu lesen.
|
|
|