在Arthur 的建议下,我将我的Fixpoint
关系改为一种相互Inductive
关系,这种关系“建立”了游戏之间的不同比较,而不是“向下钻取”。
但现在我收到一条全新的错误消息:
Error: Parameters should be syntactically the same for each inductive type.
我认为错误消息是说我需要为所有这些互归纳定义使用相同的确切参数。
我意识到有一些简单的技巧可以解决这个问题(未使用的虚拟变量,长函数类型,其中包含所有内容forall
),但我不明白为什么我应该这样做。
有人可以解释这种对互归纳类型的限制背后的逻辑吗?有没有更优雅的方式来写这个?这种限制是否还意味着对彼此的归纳调用都必须使用相同的参数(在这种情况下,我不知道有任何黑客可以节省大量的代码重复)?
(所有类型和术语的定义,例如 compare_quest、game、g1side 等,与我在第一个问题中的定义没有变化。
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).
在 CGT 中,通常两个玩家(名为Left
和Right
)轮流玩游戏,最后一步的玩家获胜。每个游戏(意味着游戏中的每个位置)都可以读为一组Left
' 选项和一组Right
' 选项写为{G_L | G_R}
。在比较两个游戏时,他们可以通过以下四种不同方式中的任何一种进行比较:<
、>
、=
或||
。
一个游戏是A < B
ifB
绝对比A
for好Left
,不管谁先走。A > B
ifA
比B
for好Left
。A = B
如果两个游戏是等价的(从某种意义上说,游戏的总和A + -B
是零游戏,所以先走的玩家输了)。而且,A || B
如果哪个游戏更适合Left
取决于谁先走。
检查两个游戏之间比较的一种方法如下:
A <= B
如果所有A
的Left
孩子都是<| B
并且A <|
所有的孩子都是B
正确的孩子。A <| B
ifA
有一个右孩子,<= B
或者如果A <=
有任何一个B
左孩子。并且,同样对于
>=
和>|
。
因此,然后通过查看这对关系中的哪一对适用于两个游戏A
and B
,可以确定是A < B
( A<=B
and A<|B
)、A=B
( A<=B
and A>=B
)、A > B
( A>=B
and A>|B
) 还是A || B
( A<|B
and A>|B
)。