归纳谓词枚举集合元素

时间:2019-01-08 08:33:23

标签: isabelle

是否可以使以下示例正常工作?

inductive elems where
  "x |∈| xs ⟹
   elems xs x"

code_pred [show_modes] elems .

values "{x. elems {|1::nat,2,3|} x}"

1 个答案:

答案 0 :(得分:1)

默认情况下,谓词编译器对有限集和成员运算符|∈|一无所知。但是,如果添加以下代码段,则可以使用。

lemma fmember_code_predI [code_pred_intro]:
  "x |∈| xs" if "Predicate_Compile.contains (fset xs) x"
  using that by(simp add: Predicate_Compile.contains_def fmember.rep_eq)

code_pred fmember
  by(simp add: Predicate_Compile.contains_def fmember.rep_eq)

这是为什么起作用的原因:常量Predicate_Compile.contains实现了对普通集合的枚举,而谓词编译器也知道这一点。具有属性code_pred_intro的引理告诉谓词编译器对待fset上的成员资格,就好像它被定义为以lemma语句作为引入规则的归纳谓词一样。然后,在code_pred命令本身,必须证明相应的消除规则。这两个规则(引入规则和消除规则)足以使谓词编译器进行模式分析,编译方程式并证明它们是正确的。

您甚至不需要定义自己的谓词elemsfset的会员资格直接起作用:

values "{x. x |∈| {|1::nat,2,3|}}"