Können Sie eine eindeutige Spezifikation in einer natürlichen Sprache wie Englisch schreiben?


10

Es scheint mir, dass Sie unmöglich eine Softwarespezifikation in Englisch schreiben können, die völlig frei von Mehrdeutigkeiten ist, einfach aufgrund des informellen Charakters der natürlichen Sprache - und daher muss eine wirklich eindeutige Spezifikation Code enthalten, der in einer formal spezifizierten Sprache geschrieben ist.

Ist das ein bekanntes Ergebnis oder fehlt mir etwas?


1
"Code in einer formal festgelegten Sprache geschrieben". Das wäre doch Mathematik und Logik, oder? Ist das nicht was Mathe und Logik sind? Es scheint seltsam zu fragen, da diese Sprachen immer zum ausdrücklichen Zweck der Eindeutigkeit existierten. Warum fragst du?
S.Lott

@ S.Lott: Benutzer möchten Spezifikationen in ihrer eigenen Sprache, nicht in Mathematik oder formaler Logik. Es ist unsere Aufgabe, zwischen den beiden Domänen zu übersetzen.
tdammers

2
Ihr Code mag eindeutig sein, aber das bedeutet nicht, dass er korrekt ist.
JeffO

1
@tdammers: Was? Die Frage war nach natürlicher Sprache vs. formaler Sprache. Was haben Benutzer damit zu tun? Was ist, wenn der Benutzer tatsächlich ein Logiker ist? Schreiben "Business Analysten" normalerweise nicht im Namen der Benutzer? Das "Benutzer" -Ding scheint fadenscheinig und außerhalb dieser Frage.
S.Lott

@ S.Lott: Ich ging von einer Situation aus, in der Sie die Software einem Kunden / Benutzer / anderen nicht technischen Stakeholder beschreiben müssen, was der beste Grund wäre, überhaupt eine natürliche Sprache verwenden zu wollen.
tdammers

Antworten:


9

Haben Anwälte das nicht immer getan, um Unklarheiten zu vermeiden?

Das Ergebnis ist, dass sie auf unnatürlichste Weise schreiben. Der Versuch, ihre Papiere zu lesen, ist schwieriger als je zuvor, und trotzdem gibt es immer Inkonsistenzen und Unklarheiten.

Sie haben Recht, Sie können keine Software-Spezifikation schreiben, die völlig frei von Mehrdeutigkeiten ist, aber Sie werden es auch nicht schaffen, eine formal festgelegte Sprache zu implementieren.

Dies ist auch der Grund, warum wir unseren Code dokumentieren, da es manchmal schwierig ist, ihn für unsere Gedanken zu lesen.

Es macht keinen Sinn, Code mit einem anderen Code zu dokumentieren.


2
Einige Anwälte verschleiern und verschleiern gerne Dinge. Kommt auf dein Ziel an.
Duffymo

1
Sie verwechseln Anwälte mit Mathematikern.
Doc Brown

1
@Doc: Mathematik ist nur ein weiterer Code, da nur Mathematiker ihn lesen können und es keinen Sinn macht, Code mit Code zu dokumentieren, das ist Kryptographie.
Jose Faeti

2
@ Jose: Ich würde sagen, Sie sind stark zu stark vereinfacht. 99% aller mathematischen Beweise sind in natürlicher Sprache verfasst - natürlich eine Fachsprache mit speziellen Begriffen und mehr oder weniger Formeln, aber sicherlich keine "formal festgelegte Sprache".
Doc Brown

@Doc: das sage ich ... Dokumente in natürlicher Sprache. Es macht keinen Sinn, einen Code mit einem anderen Code zu erklären.
Jose Faeti

4

Unmöglich? Fragen wir zuerst, ob es wünschenswert ist. Wenn wir uns einig sind, dass dies unmöglich ist und es immer noch viele nützliche Software gibt, erscheint das Ziel einer eindeutigen Spezifikation akademisch.

Ich würde sagen, dass es unmöglich ist zu beweisen, dass alles perfekt und eindeutig ist, sowohl für die Spezifikation als auch für die Software.

Ich denke, es hängt von der Größe des Problems ab. Wenn das Problem klein genug ist, mathematischer Natur ist und vielleicht einige andere Kriterien fehlen, würde ich sagen, dass es möglich ist, eine Spezifikation zu schreiben, die funktioniert.

Je größer das Problem, desto breiter das Publikum, desto schwieriger ist es.

Avionik und andere komplexe Probleme legen jedoch nahe, dass es möglich ist, "gut genug" Spezifikationen auf Englisch zu schreiben, um große Probleme zu lösen.


2
"gut genug ist gut genug, aber Perfektion ist eine PITA" - Ich habe früher in der Gebäudeumgebungskontrolle gearbeitet, und es gibt dort keine völlig eindeutige Spezifikation, selbst wenn sie 400 Seiten umfasst - manchmal war das egal und für die Zeiten hatten wir RFIs
HorusKol

4

Nun ... eine völlig eindeutige Spezifikation des Problems ist der eigentliche Code :)

Dies ist ein bekanntes Problem, und für spezielle geschäftskritische Systeme ist es zwingend erforderlich, eine eindeutige Spezifikation in einer formalen (Programmier-) Sprache zu schreiben und diese dann in einen Code umzuwandeln, der nachweislich das tut, was die Spezifikation sagt. Dies ist ein sehr enges Feld, 99,999% der Entwickler müssen solche Aufgaben nie erledigen, aber ich habe einmal mit einem Mann gesprochen, der dies für ein Verkehrskontroll- / Eisenbahnsystem getan hat.


3

Ich bin ein W3C-Anhänger und neige dazu, Artikel basierend auf ihren Spezifikationen zu schreiben. Meine Erfahrung zeigt mir, dass das Lesen einer Spezifikation ohne geschriebene Beispielcodes einfach Kopfschmerzen bereitet.

Ich stimme vollkommen zu und ich denke, der Hauptgrund ist, dass Entwickler dazu neigen, Code besser zu lesen und zu verstehen. Stellen Sie sich vor, Sie erhalten eine mathematische Arbeit ohne Formel.

To calculate the result, simply add variable x to variable y, 
and then divide that by the b factor.

oder:

result = (x + y) / b

Welches ist kürzer? Welches ist besser lesbar? Was bringt mehr Verständnis mit sich?

Gleiches gilt für Spezifikationen. Wenn Sie zu den technischen Teilen gelangen, kann das Schreiben einer Codezeile häufig einen langen Erklärungsabschnitt verdeutlichen.


Und selbst dann werde ich fragen, was die Domänen von (x + y) und (x + y) / b sind. Sind sie doppelt? Sind sie ganze Zahlen? Sind sie Ganzzahlen unendlicher Länge? Ich hoffe, wenn es sich um ganze Zahlen handelt, haben Sie die Regeln zum Runden geschrieben :-)
xanatos

1

Angenommen, es gibt eine formale Sprache, mit der eindeutige Spezifikationen geschrieben werden können. Dann schlage ich vor, dass es eine bijektive Zuordnung zu einer Teilmenge des Englischen geben sollte. Daher sollte es möglich sein, eindeutige Spezifikationen zu schreiben, wenn Sie sich an diese Teilmenge halten.

Aber jede formale Sprache, die ausdrucksstark genug ist, um etwas Interessantes zu tun, ist nicht frei von Inkonsistenzen (Gödel-Unvollständigkeit).


Ich bin mir sicher, dass die Argumentation nicht eindeutig ist, da sie in einfachem Englisch verfasst ist. Könnten Sie es in einer formalen Sprache schreiben?
Blubb

1
Ich glaube, dass dies Ihre Annahme ist: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.88.1151
Thomas Owens

Und dann gibt es das Problem des Anhaltens, das sich in Mehrdeutigkeit
niederschlägt

1
-1 für das falsche Gödels-Theorem.
Ingo

1

Spezifikationen sind mehrdeutig und ungenau, weil Menschen mehrdeutig und ungenau sind. Finden Sie eine perfekte Person und vielleicht können Sie dann eine perfekte Spezifikation erhalten.

Englisch, Suaheli, Sanskrit oder Babylonisch machen keinen Unterschied.


1

Mehrdeutigkeit ist in diesem Zusammenhang tatsächlich eine Stärke.

Um zu erklären , warum sie sich für einen Moment annehmen , dass es ist möglich , die englische Sprache in eine ganz eindeutigen Weise zu verwenden, so dass jedes Problem , die programmatisch gelöst werden kann , vollständig und eindeutig ausgedrückt werden. Wenn wir diese Variante des Englischen verwenden und unsere Beschreibung tatsächlich das vollständig und eindeutig zu schreibende Programm beschreibt, folgt logischerweise, dass es möglich sein muss, eine automatisierte Übersetzung in die Zielprogrammiersprache durchzuführen - mit anderen Worten, die Variante von Englisch, das wir uns vorgestellt haben, ist eigentlich eine Programmiersprache.

Leute, die Designdokumente lesen (insbesondere funktionale Designs), wollen diese Detailebene nicht wirklich - das Lesen der Quelle eines Programms, ob in C ++, Java oder eindeutigem Englisch, ist weit über dem Kopf eines durchschnittlichen Nicht-Programmierers. Hier kommen natürliche Sprachen ins Spiel: Sie ermöglichen es dem Verfasser einer Spezifikation, in beide Richtungen auf der Detailskala zu gleiten, irrelevante Implementierungsdetails in den Subtext zu verschieben oder sie vollständig nicht zu spezifizieren. Natürliche Sprachen sind voll von Hilfsmitteln, um die Bedeutung relativ klar zu vermitteln, obwohl Sie keine genaue Definition angeben (was Teil dessen ist, was automatisierte Übersetzungen so schwierig macht).

Das Ziel ist also normalerweise keine vollständige, korrekte und eindeutige Spezifikation. Das Ziel ist es, eine Spezifikation zu schreiben, die den Menschen klar zeigt, was Sie gerade bauen.

Wann immer Sie korrekt und eindeutig benötigen und die Dinge sowieso technisch werden, ist Pseudocode oft wertvoller als natürliche oder starre formale Sprachen - es kann immer noch irrelevante Details auslassen (durch Aufrufen nicht spezifizierter Funktionen / Prozesse), aber die Struktur ist eindeutig .


0

Sie vermissen nichts, außer dass die Dokumentation für Menschen zum Lesen geschrieben wurde. Eine gewisse Mehrdeutigkeit wird erwartet und ist sogar zu begrüßen, da knapper Text schwer zu lesen ist (= nicht für Menschen).

Die Angabe der Dokumentation für eine formale Sprache in einer weiteren formalen Sprache wäre eine Art Henne-Ei-Problem.

Wenn Sie wirklich eine formale Spezifikation benötigen, gibt es formale Möglichkeiten , Modelle zu überprüfen . Es ist ein aktives und sehr interessantes Forschungsgebiet, aber die Endbenutzer hier sind Maschinen, keine Menschen.


0

(Einige meiner Punkte wurden bereits in anderen Antworten erwähnt, aber ich habe das Gefühl, dass ich eine ausreichend andere Perspektive biete, damit dies eher eine Antwort als einen Kommentar wert ist.)

Bevor wir uns mit der Frage befassen, ob eine Spezifikation wirklich und vollständig eindeutig sein kann, müssen wir uns mit der Frage befassen, ob sie zumindest auf der Ebene, nach der Sie fragen, eindeutig sein sollte .

Lassen Sie mich dies aus der Perspektive eines Programmmanagers betrachten, der an einem kleinen bis mittleren Projekt oder einem Feature als Teil eines größeren Projekts arbeitet. Es gibt normalerweise zwei verschiedene Arten von Spezifikationen, die für ein solches Projekt geschrieben werden: eine funktionale (oder PM) Spezifikation und eine Design (oder Dev) Spezifikation:

  • Die Funktionsspezifikation hat die Aufgabe zu beschreiben, was das Projekt oder die Funktion tun soll, häufig aus Sicht des Kunden. Es sollte im Allgemeinen nicht beschrieben werden, wie dies getan werden sollte. Abhängig von der Art des Projekts ist es dem Kunden vielleicht wichtig, wie die nach außen gerichtete API aussieht. Ist es dem Kunden jedoch wichtig, ob Klasse A von Klasse B erbt oder Schnittstelle C implementiert? Er sollte nicht. Und die Funktionsspezifikation sollte es auch nicht. Dies führt bereits zu einer Mehrdeutigkeitsebene: der des technischen Designs.
  • Die Entwurfsspezifikation hat die Aufgabe zu beschreiben, wie die funktionalen Anforderungen aus Sicht des Architekten oder technischen Designers des Merkmals oder Projekts erfüllt werden sollten. Es ist beabsichtigt, die allgemeinen Unklarheiten des technischen Designs zu beseitigen. Dies enthält die Details, die Sie in der Funktionsspezifikation nicht wollten, wie z. B. die Architektur der Lösung, einschließlich Klassenstruktur, Vererbung, möglicherweise sogar einzelne Funktionen und Methoden, je nach Umfang und Umfang des Projekts. Interessiert es den Architekten, wie Sie Ihre temporären Variablen nennen oder ob Sie eine Liste oder ein Array für einen internen Datentyp verwenden? Angenommen, sie vertraut ihren Entwicklern, sollte sie nicht und auch nicht die Designspezifikation. Dies führt eine zweite Ebene der Mehrdeutigkeit ein: die der Implementierung.

Im Allgemeinen werden diese Details auf Implementierungsebene nicht in einem formalen Dokument erfasst, sondern per se im Code selbst einschließlich der Kommentare dokumentiert . Diese Mehrdeutigkeit ermöglicht es einem guten Entwickler, seine eigenen Fähigkeiten einzusetzen und die detailorientierten technischen Entscheidungen zu treffen, die das Markenzeichen eines guten einzelnen Entwicklers sind. Aus diesem Grund werde ich nicht zögern zu sagen, dass Mehrdeutigkeit in einer Spezifikation in der Tat eine gute Sache ist: Sie ermöglicht Entwicklern, ihre Arbeit zu erledigen, und erhebt sie über bloße "Code-Affen".

Dies bedeutet jedoch nicht, dass das gesamte Dokument mehrdeutig sein sollte. Auf hoher Ebene sollte es keine Unklarheiten über die Schnittstelle zum Kunden geben. Wenn die Funktion über eine öffentlich zugängliche API verfügt, sollte diese genau definiert werden. Wenn das System die Übergabe eines Datums für seine Arbeit benötigt, sollte dieses Datum in der lokalen Zeitzone oder UTC liegen? Welches Format wird benötigt? Muss es millisekundengenau sein oder ist die Minute in Ordnung?

Um auf die Frage zurückzukommen, ob mit natürlicher Sprache eindeutige Spezifikationen erstellt werden können, ist es wahr, dass es nicht sehr gut ist, dieses Maß an Klarheit zu erfassen. Ich habe es unter bestimmten Umständen gesehen, aber dies sind wahrscheinlich einzigartige Ausnahmen, die wir nicht universell anwenden können. In den meisten Fällen wird Mehrdeutigkeit mithilfe von Fachjargon, Diagrammen oder sogar Pseudocode behoben. Sobald Sie die Hilfe solcher Tools in Anspruch nehmen, ist die natürliche Sprache nicht mehr der einzige Deskriptor. Da diese Tools sogar eine völlig funktional eindeutige Spezifikation viel klarer machen können, würde ich sagen, dass ein solches Unterfangen nicht einmal versucht werden sollte.

Da die natürliche Sprache im Allgemeinen durch diese Tools ergänzt wird, um sie funktional eindeutig zu machen, ist es meiner professionellen Meinung nach nicht ausreichend, dass die natürliche Sprache allein nicht ausreicht, um in allen Fällen eindeutige Spezifikationen zu erstellen.


0

Man kann die natürliche Sprache relativ eindeutig machen, aber nur mit großen Schwierigkeiten.

Die Anwaltschaft braucht dringend eine Sprache, die so eindeutig wie möglich ist. Während vieles darüber, wie ein Gesetz angewendet wird, offen für Interpretationen sein kann, sollte das, was die Wörter bedeuten, nicht so sein.

Dies muss zur Erfindung der Rechtssprache führen. Wie weit willst du gehen?


0

Es gibt eine Reihe von Spezifikationen der offenen Gruppe, der ISO, der IETF und der ITU, die so eindeutig sind, dass wettbewerbsintensive Unternehmen recht erfolgreich zusammenarbeiten können. Es gibt eine Reihe von Spezifikationen, die die Grundlage für Verträge oder Gesetze bilden, bei denen es um Millionen von Dollar geht.

Daher sind die Spezifikationen möglicherweise nicht "perfekt". Das liegt jedoch daran, dass Menschen nicht perfekt sind. Zum Beispiel ist es eindeutig, dass HTTP einen "Referer" -Header verwenden sollte - die korrekte Schreibweise ist tatsächlich "Referrer".

Die englische Sprache kann eindeutig sein, aber Menschen können Fehler machen - einschließlich Mehrdeutigkeiten.

Darüber hinaus kann es hilfreich sein, bei Details, die noch nicht abgeschlossen sind oder in Zukunft aktualisiert werden müssen, absichtlich mehrdeutig zu sein. Zum Beispiel kann eine Spezifikation einen "Hash" angeben, anstatt md5, sha1, crc32 usw. spezifisch anzugeben.


0

Ich glaube, die richtige Antwort ist negativ. Folgende Fragen müssen unterschieden werden:

  1. Ist es möglich, eine Softwarespezifikation in einer natürlichen Sprache zu schreiben, die keine Mehrdeutigkeiten enthält?
  2. Ist es möglich, Software in einer natürlichen Sprache zu schreiben, die keine Mehrdeutigkeiten enthält?

Der Unterschied zwischen der ersten und der zweiten Frage betrifft den Detaillierungsgrad, den Umfang der erforderlichen Interpretation und die Regeln für die Konstruktion von Sätzen in natürlicher Sprache zum Zwecke des Schreibens der Software oder der Softwarespezifikation.

Die Antwort auf die zweite Frage ist positiv. Bei einer entsprechend eingeschränkten Teilmenge einer natürlichen Sprache mit vereinbarten Regeln für die Satzkonstruktion und -bedeutung kann Code in grammatikalischen englischen Sätzen geschrieben werden. Beispielsweise erlaubt die folgende Sprache das Schreiben von Zuweisungsanweisungen eindeutig:

Variables: x,y,z,...
Constants: 1,2,3,...
Rules: (1) if x is a variable and n a constant, then
           "The variable x contains the number n" is a sentence.
       (2) if x is a variable and n a constant, then
           "Assign the number n to the variable x" is a sentence.

Das heißt, können wir systematisch Code übersetzen in der formalen Programmiersprachen in natürlichen Sprachen geschrieben von der Beschreibung jedes Verfahren. Auf der anderen Seite, eine Software - Spezifikation erfordert oft Interpretation. Ob eine Softwarespezifikation eindeutig angegeben werden kann, hängt daher vom Detaillierungsgrad der Spezifikation ab. Bei einer ausgewählten Domäne, über die sich die Spezifikation erstreckt, mit bestimmten Operationen für diese Domäne kann jedoch ein ähnlicher Übersetzungsprozess ausgeführt werden. Zum Beispiel:

Over the domain D supporting operations f,g,h over elements a,b,c in relations
P,R,Q with properties φ,ψ,θ, design a program that does X,Y,Z.

wo die Aussagen X, Y, Zenthalten nur die Elemente in der Spezifikation des Vorwort erwähnt und sind in einem entsprechend formal geschrieben und vereinbarte Teilmenge einer natürlichen Sprache. Die Zweideutigkeiten werden dann betreffen , wie die Spezifikation zu implementieren - aber dies wird zu erwarten.


0

Nein

Eine eindeutige Spezifikation einer Berechnung ist ein Computerprogramm.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.