Diese Begriffe stammen aus der Berechnungstheorie und sind daher im Kontext der Berechnungstheorie aussagekräftiger als im Kontext des Software-Engineerings
In den meisten Standardberechnungsmodellen werden Rechenprobleme als Sprachen dargestellt . Eine Sprache ist eine Reihe von Zeichenfolgen. Ein Algorithmus ist also nur ein System oder eine Prozedur, die entscheidet, ob eine bestimmte Zeichenfolge Mitglied einer Sprache ist (indem sie true oder false zurückgibt). In Bezug auf die Softwareentwicklung befasst sich die Berechnungstheorie speziell mit Funktionen, die so aussehen, vorausgesetzt, dass Zeichenfolgen unveränderlich sind:
boolean some_function(string argument){...}
Wir bezeichnen diese Funktion als vollständig, wenn sie für jedes Argument, das Mitglied der Sprache ist, true zurückgibt. Wir nennen es Sound, wenn es für jedes Argument, das kein Mitglied der Sprache ist, false zurückgibt.
Mit anderen Worten, es ist vollständig, wenn es immer true zurückgibt, wenn es true zurückgeben soll, und klingt, wenn es immer false zurückgibt, wenn es false zurückgeben soll.
Wie überträgt sich dies auf andere Arten von Funktionen? Wie sich herausstellt, ist es fast immer möglich, eine beliebige Datenmenge in einen String zu packen und ihn innerhalb der Funktion wiederherzustellen. Die Einschränkung von Argumenttyp und Arität ist also nichts anderes als eine theoretische Vereinfachung. Die Einschränkung des Rückgabetyps ist jedoch wichtiger. Probleme, die ein boolesches Ergebnis erfordern, werden als Entscheidungsprobleme bezeichnet . Viele Berechnungstheorien beinhalten Entscheidungsprobleme. Die Mengen P und NP sind auf Entscheidungsprobleme beschränkt (und NP könnte zumindest ohne diese Einschränkung nicht angemessen definiert werden). Das Stopp-Problem ist ein weiteres Beispiel für ein stark untersuchtes Entscheidungsproblem.
Ich bin der Meinung, dass diese Begriffe nicht außerhalb des Bereichs von Entscheidungsproblemen verallgemeinern, daher ist der Unterschied zwischen ihnen bei der Erörterung einer allgemeinen Funktion nicht wirklich bedeutsam.