在定义归纳谓词时,我可以选择哪些参数是固定的,哪些参数不固定。对于一个人为的例子,请考虑:
inductive foo for P where
"foo P True (Inl x) (Inl x)"
是否有可能将其转换为具有一个固定参数和一个非固定参数的归纳定义集?
inductive_set Foo for P where
"(Inl x, Inl x) : Foo P True"
被拒绝并显示错误消息:
Argument types 'd, bool of Foo do not agree with types'd of declared parameter
我知道我可以根据归纳谓词版本(例如Foo P b = {(x, y). foo P b x x}
)来定义一个集合,但是在我可以应用归纳或案例分析之前我总是要展开它(或者必须引入相应的Foo
的规则,似乎有点多余。)
答案 0 :(得分:4)
这是inductive_set
的限制,所有参数必须声明为for
;特别是,你无法实例化它们。目前,唯一的解决方案如您所述:首先定义谓词,然后为集合引入相应的规则。
幸运的是,您可以使用属性pred_to_set
和to_set
自动执行此操作。在您的示例中,如下所示:
inductive foo for P where
"foo P True (Inl x) (Inl x)"
definition Foo where "Foo P b = {(x, y). foo P b x y}"
lemma foo_Foo_eq [pred_set_conv]: "foo P b = (%x y. (x, y) : Foo P b)"
by(simp add: Foo_def)
lemmas Foo_intros [intro?] = foo.intros[to_set]
lemmas Foo_induct [consumes 1, induct set: Foo] = foo.induct[to_set]
lemmas Foo_cases [consumes 1, cases set: Foo] = foo.cases[to_set]
lemmas Foo_simps = foo.simps[to_set]