Nach Arthur's suggestion, änderte ich meine Fixpoint
Beziehung zu einer gegenseitigen Inductive
Beziehung, die die verschiedenen Vergleiche zwischen Spielen "aufbaut" anstatt "bohrend".Warum müssen coq gegenseitig induktive Typen die gleichen Parameter haben?
Aber jetzt habe ich eine völlig neue Fehlermeldung erhalte:
Error: Parameters should be syntactically the same for each inductive type.
denke ich, wird die Fehlermeldung, dass ich die gleichen genauen Parameter für alle diese gegenseitige induktive Definitionen benötigen.
Ich realisiere, es gibt einfache Hacks um dies zu umgehen (unbenutzte Dummy-Variablen, lange Funktionstypen mit allem innerhalb der forall
), aber ich sehe nicht, warum ich sollte.
Kann jemand die Logik hinter dieser Einschränkung gegenseitiger induktiver Typen erklären? Gibt es einen eleganteren Weg dies zu schreiben? Bedeutet diese Einschränkung auch, dass die induktiven Aufrufe zueinander die gleichen Parameter verwenden müssen (in diesem Fall kenne ich keine Hacks, die scheußliche Mengen an Code-Duplizierung speichern)?
(Die Definitionen aller Typen und Begriffe wie compare_quest, Spiel, g1side etc. sind unverändert von dem, was sie in meinem first question waren.
Inductive gameCompare (c : compare_quest) : game -> game -> Prop :=
| igc : forall g1 g2 : game,
innerGCompare (nextCompare c) (compareCombiner c) (g1side c) (g2side c) g1 g2 ->
gameCompare c g1 g2
with innerGCompare (next_c : compare_quest) (cbn : combiner) (g1s g2s : side)
: game -> game -> Prop :=
| compBoth : forall g1 g2 : game,
cbn (listGameCompare next_c cbn (g1s g1) g2)
(gameListCompare next_c cbn g1 (g2s g2)) ->
innerGCompare next_c cbn g1s g2s g1 g2
with listGameCompare (c : compare_quest) (cbn : combiner) : gamelist -> game -> Prop :=
| emptylgCompare : cbn_init cbn -> forall g2 : game, listGameCompare c cbn emptylist g2
| otlgCompare : forall (g1_cdr : gamelist) (g1_car g2 : game),
(cbn (listGameCompare c cbn g1_cdr g2) (gameCompare c g1_car g2)) ->
listGameCompare c cbn (listCons g1_car g1_cdr) g2
with gameListCompare (c : compare_quest) (cbn : combiner) : game -> gamelist -> Prop :=
| emptyglCompare : cbn_init cbn -> forall g1 : game, gameListCompare c cbn g1 emptylist
| otglCompare : forall (g1 g2_car : game) (g2_cdr : gamelist),
(cbn (gameListCompare c cbn g1 g2_cdr) (gameCompare c g1 g2_car)) ->
gameListCompare c cbn g1 (listCons g2_car g2_cdr).
In CGT, in der Regel zwei Spieler (genannt Left
und Right
) Wendet abwechselnd ein Spiel an, in dem der Spieler, der den letzten Zug macht, gewinnt.Jedes Spiel (dh jede Position in einem Spiel) kann als eine Reihe von Left
Optionen und einer Reihe von Right
Optionen gelesen werden, geschrieben als {G_L | G_R}
Wenn Sie zwei Spiele vergleichen, können Sie auf vier verschiedene Arten vergleichen: <
, >
, =
oder ||
.
Ein Spiel ist A < B
wenn B
ist strikt besser als A
für Left
, unabhängig davon, wer zuerst geht. A > B
wenn A
ist besser als B
für Left
. A = B
wenn die beiden Spiele gleichwertig sind (in dem Sinne, dass die Summe der Spiele A + -B
ein Null-Spiel ist, so dass der Spieler, der zuerst geht, verliert). Und, A || B
ob das Spiel besser ist für Left
hängt davon ab, wer zuerst geht.
Eine Möglichkeit, den Vergleich zwischen zwei Spiele zu prüfen ist, wie folgt:
A <= B
wenn alleA
Recht Kinder sLeft
Kinder<| B
undA <|
alleB
sind ".A <| B
wennA
hat ein Recht Kind, das<= B
oder wennA <=
einB
‚s linker Kinder.Und ähnlich für
>=
und>|
.
So, dann durch Sehen, das Paar dieser Beziehungen zu zwei Spielen gelten A
und B
, dann ist es möglich, zu bestimmen, ob A < B
(A<=B
und A<|B
), A=B
(A<=B
und A>=B
), A > B
(A>=B
und A>|B
) oder A || B
(A<|B
und A>|B
).
Hier ist die wiki article on CGT.
Vielen Dank, das ist gut zu wissen. Ich sehe das Problem und ich weiß, wie man es loswerden kann (wenn auch nicht ohne Code-Duplizierung). Ich habe eine Beschreibung hinzugefügt, was es bedeutet, zwei CGT-Spiele zu vergleichen. falls du noch andere Ideen hast. Danke nochmal – dspyz
Wow, dieses CGT Zeug ist wirklich cool! Danke, dass du es ein bisschen ausführlicher erklärst. Ich habe eine [gist] (https://gist.github.com/arthuraa/5882759) gepostet, die etwas davon in Coq entwickelt, vielleicht wird dir das helfen! –