Welchen Zweck hat der Typ So
? Transliteration in Agda:Also: was ist der Sinn?
data So : Bool → Set where
oh : So true
So
hebt eine Boolesche Aussage auf eine logische Eins auf. Oury und Swierstras Einführungspapier The Power of Pi gibt ein Beispiel für eine relationale Algebra, die durch die Spalten der Tabellen indiziert wird. Das Produkt aus zwei Tabellen erfordert, dass sie unterschiedliche Spalten haben, für die sie So
verwenden:
Schema = List (String × U) -- U is the universe of SQL types
-- false iff the schemas share any column names
disjoint : Schema -> Schema -> Bool
disjoint = ...
data RA : Schema → Set where
-- ...
Product : ∀ {s s'} → {So (disjoint s s')} → RA s → RA s' → RA (append s s')
ich zu konstruieren Beweise Bedingungen für die Dinge gewöhnt bin ich über meine Programme beweisen will. Es scheint natürlich, eine logische Beziehung auf Schema
s zu konstruieren Zusammenhanglosigkeit zu gewährleisten:
Disjoint : Rel Schema _
Disjoint s s' = All (λ x -> x ∉ cols s) (cols s')
where cols = map proj₁
So
gravierende Nachteile im Vergleich zu einem „richtigen“ proof-Begriff zu haben scheint: Muster auf oh
Anpassung nicht gibt Sie keine Informationen mit dem Sie einen anderen Begriff Typ-Check (Does it?) machen könnte - was würde bedeuten, So
Werte können nicht sinnvoll in interaktive Prüfung teilnehmen. Vergleichen Sie dies mit der rechnerischen Nützlichkeit von Disjoint
, die als eine Liste von Beweisen dargestellt wird, dass jede Spalte in s'
nicht in s
erscheint.
Ich glaube nicht wirklich, dass die Spezifikation So (disjoint s s')
einfacher ist als Disjoint s s'
zu schreiben - Sie können die Booleschen disjoint
Funktion ohne Hilfe von der Typprüfung definieren - und in jedem Fall bezahlt Disjoint
für sich selbst, wenn Sie bearbeiten möchten die darin enthaltenen Beweise.
Ich bin auch skeptisch, dass So
Aufwand spart, wenn Sie eine Product
konstruieren. Um einen Wert von So (disjoint s s')
zu erhalten, müssen Sie immer noch genug Mustervergleich auf s
und s'
machen, um den Typüberprüfer zu erfüllen, dass sie tatsächlich disjunkt sind. Es scheint eine Verschwendung zu sein, die so erzeugten Beweise zu verwerfen.
So
scheint sowohl für Autoren als auch Benutzer von Code, in dem es bereitgestellt wird, unhandlich. 'Also', unter welchen Umständen möchte ich So
verwenden?
Auch jeder Beweis "So b" ist propositionally gleich zu jedem anderen, was nicht unbedingt der Fall ist für den tatsächlichen "Beweis" dessen, was für eine Eigenschaft b kodiert. Manchmal willst du das. – Saizan
@Saizan, guter Punkt. Diese Eigenschaft wird auch bei der zweiten Verknüpfung in meiner Antwort ausgenutzt. Haben Sie einen schönen Anwendungsfall? – user3237465
Ich habe das Gefühl, dass es hier etwas tieferes über die Beziehung zwischen Typen gibt, die induktiv mit "Daten" definiert sind, und solchen, die rekursiv in Funktionen definiert sind. Könntest du näher erläutern, warum Agda glücklich ist, einen "So" -Wert mit deiner Definition abzuleiten, aber nicht mit meiner? –