具有类型参数的互感数据类型
Mutually Inductive Datatypes with Type Parameters
我正在尝试编写两个互感数据类型的声明,它们都采用类型参数作为参数,如下所示:
noeq
type foo 'a =
| FooA: x: 'a -> foo 'a
| Foob: y: bar 'a -> foo 'a
and bar 'b =
| BarA: x: int -> bar 'b
| BarF: y: foo 'b -> bar 'b
我收到如下错误信息:
LabeledStates.fst(59,0-64,31):(错误 67)未能解决归纳法的宇宙不等式
报告了 1 个错误(见上文)
(第 59 行是包含 "type foo 'a" 的行)
此错误是什么意思,我该如何解决?
如果我删除类型参数(例如 foo.x 类型为 int),我就不会再出错了。同样,如果我只给其中一种类型一个类型参数而不给另一个类型参数,我也没有错误。
F* 在这种情况下无法推断宇宙。但是,您可以提供明确的 Universe 实例化。例如,这里有三种可能的解决方案:
首先,一个双宇宙多态的,最通用但也可能使用起来很麻烦
noeq
type foo (a:Type u#a) : Type u#(max a b) =
| FooA: x: a -> foo a
| Foob: y: bar u#b u#a a -> foo a
and bar (b:Type u#b) : Type u#(max a b) =
| BarA: x: int -> bar b
| BarF: y: foo u#b u#a b -> bar b
单宇宙多态解决方案,可能更简单一些,但不太通用:
noeq
type foo1 (a:Type u#a) : Type u#a =
| Foo1A: x: a -> foo1 a
| Foo1b: y: bar1 u#a a -> foo1 a
and bar1 (b:Type u#a) : Type u#a =
| Bar1A: x: int -> bar1 b
| Bar1F: y: foo1 u#a b -> bar1 b
最后,一个专用于宇宙 0 的版本,如果它满足您的需要,可能是最容易使用的,但也是最不通用的:
noeq
type foo0 (a:Type u#0) : Type u#0 =
| Foo0A: x: a -> foo0 a
| Foo0b: y: bar0 a -> foo0 a
and bar0 (b:Type u#0) : Type u#0 =
| Bar0A: x: int -> bar0 b
| Bar0F: y: foo0 b -> bar0 b
我正在尝试编写两个互感数据类型的声明,它们都采用类型参数作为参数,如下所示:
noeq
type foo 'a =
| FooA: x: 'a -> foo 'a
| Foob: y: bar 'a -> foo 'a
and bar 'b =
| BarA: x: int -> bar 'b
| BarF: y: foo 'b -> bar 'b
我收到如下错误信息:
LabeledStates.fst(59,0-64,31):(错误 67)未能解决归纳法的宇宙不等式 报告了 1 个错误(见上文)
(第 59 行是包含 "type foo 'a" 的行)
此错误是什么意思,我该如何解决?
如果我删除类型参数(例如 foo.x 类型为 int),我就不会再出错了。同样,如果我只给其中一种类型一个类型参数而不给另一个类型参数,我也没有错误。
F* 在这种情况下无法推断宇宙。但是,您可以提供明确的 Universe 实例化。例如,这里有三种可能的解决方案:
首先,一个双宇宙多态的,最通用但也可能使用起来很麻烦
noeq
type foo (a:Type u#a) : Type u#(max a b) =
| FooA: x: a -> foo a
| Foob: y: bar u#b u#a a -> foo a
and bar (b:Type u#b) : Type u#(max a b) =
| BarA: x: int -> bar b
| BarF: y: foo u#b u#a b -> bar b
单宇宙多态解决方案,可能更简单一些,但不太通用:
noeq
type foo1 (a:Type u#a) : Type u#a =
| Foo1A: x: a -> foo1 a
| Foo1b: y: bar1 u#a a -> foo1 a
and bar1 (b:Type u#a) : Type u#a =
| Bar1A: x: int -> bar1 b
| Bar1F: y: foo1 u#a b -> bar1 b
最后,一个专用于宇宙 0 的版本,如果它满足您的需要,可能是最容易使用的,但也是最不通用的:
noeq
type foo0 (a:Type u#0) : Type u#0 =
| Foo0A: x: a -> foo0 a
| Foo0b: y: bar0 a -> foo0 a
and bar0 (b:Type u#0) : Type u#0 =
| Bar0A: x: int -> bar0 b
| Bar0F: y: foo0 b -> bar0 b