Warum ist die Subtypisierung von Verhaltensweisen unentscheidbar?

12

Liskovs Arbeit in diesem Bereich konzentrierte sich auf die Subtypisierung des Verhaltens, die neben der in diesem Artikel erörterten Sicherheit des Typsystems auch verlangt, dass die Subtypen alle Invarianten bewahren, die in einigen Verträgen durch die Supertypen garantiert werden. [3] Diese Definition der Untertypisierung ist im Allgemeinen nicht entscheidbar und kann daher nicht von einer Typprüfung überprüft werden.

Von: http://www.wikiwand.com/en/Subtyping#/Function_types

q126y
quelle

Antworten:

24

Der Betriebsvertrag ovom Typ Tsei, dass er für alle Eingaben anhält. Entscheiden Sie nun, ob die Operation odes Subtyps S <: Tdiesen Vertrag erfüllt: Sie haben gerade das Halteproblem gelöst .

Im Allgemeinen S::omuss die gleiche Funktion berechnet werden, als T::oob S <: T. Die Entscheidung, ob zwei Programme dieselbe Funktion berechnen, wird als Funktionsproblem bezeichnet und entspricht der Lösung des Halteproblems.

Im Allgemeinen entspricht die statische Entscheidung für eine nicht-triviale Runtime-Eigenschaft fast immer dem Problem des Anhaltens.

Jörg W. Mittag
quelle
3
Diese letzte Zeile nagelt es. In dem Moment, in dem Sie eine Eigenschaft darüber beweisen möchten, was das Programm in einer Verhaltenseinstellung tun könnte, treten Sie in das Unmögliche. Der Grund, warum Typsysteme und statische Analysewerkzeuge funktionieren, besteht darin, dass sie eine andere Sprache behandeln (die Typen des Programms, den Umfang der Variablen im Programm usw.) und nicht die Eigenschaften, wie das Programm direkt ausgeführt wird.
Benjamin Gruenbaum
5
@BenjaminGruenbaum Jorgs Antwort und Ihr Kommentar sind richtig, aber es gibt eine Subtilität, die ich klarstellen möchte. Es ist oft möglich, eine Eigenschaft über ein bestimmtes Programm zu beweisen . Es gibt einfach keinen Algorithmus, dem Sie blind folgen können, der für alle Programme funktioniert . Betrachten Sie diese in Java geschriebene Methode: BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }Es ist nicht schwer zu beweisen, dass eine bestimmte Methode immer die Summe der Elemente eines Integer-Arrays zurückgibt und nichts anderes tut (vorausgesetzt, das Argument ist nicht null).
Doval
1
Und wenn es nicht dem Stopp-Problem entspricht, ist es oft noch schlimmer . Denn unmöglich war schon schwer genug.
user2357112 unterstützt Monica
2
Oder, um Dovals Standpunkt auf eine andere (unverblümte) Weise auszudrücken, genau aus diesem Grund sind nicht- sprachliche vollständige Sprachen interessant und nützlich. Für die eigentliche Arbeit ist oft keine Turing-Vollständigkeit (sicherlich auf Modulebene) erforderlich.
Leushenko
@Doval: Sehr guter Punkt. Zwar gibt es keinen Algorithmus, der die Beendigung und / oder Richtigkeit eines Zufallsprogramms nachweist, aber es ist möglich, Programme so zu schreiben, dass Sie ihre Richtigkeit nachweisen können.
Giorgio
12

Denn fast jede Frage zum Verhalten von Programmen ist unentscheidbar. Nach dem Satz von Rice ist jedes Entscheidungsproblem der Form:

Einige Programme berechnen Funktionen mit dieser Eigenschaft, andere Programme berechnen Funktionen ohne diese Eigenschaft. Hat die von P berechnete Funktion bei gegebenem Programm P die oben genannte Eigenschaft oder nicht?

ist unentscheidbar. So können Sie beispielsweise nicht immer Code, der das Quadrat einer Eingabe berechnet, von Code unterscheiden, der dies nicht tut. Obwohl es in einfachen Fällen oft möglich ist, zu beweisen, dass eine Funktion dies tut oder nicht, gibt es kein allgemeines Verfahren, das für alle Programme funktioniert.

Fast jede interessante Verhaltensinvariante fällt unter den Satz von Rice, da diese Aussagen selten (wenn überhaupt) darüber sprechen, wie die Methode intern aussieht, was sie zurückgibt und welche Nebenwirkungen sie als Reaktion auf bestimmte Eingaben verursacht.


quelle
3
Sie könnten ein bisschen klarstellen: Es ist nicht so, dass ein einzelnes gegebenes Programm, egal wie pathologisch, allen Analysen widerstehen könnte, sondern dass es für jede gegebene Analyse mindestens ein Programm gibt, das damit nicht richtig kategorisiert werden kann.
Nathan Tuggy