Isabelle 枚举集合元素的归纳谓词

Isabelle 枚举集合元素的归纳谓词,isabelle,Isabelle,可以让下面的示例工作吗 inductive elems where "x |∈| xs ⟹ elems xs x" code_pred [show_modes] elems . values "{x. elems {|1::nat,2,3|} x}" 默认情况下,谓词编译器对有限集和成员操作符|∈|。但是,如果添加以下代码段,则它可以工作 lemma fmember_code_predI [code_pred_intro]: "x |∈| xs" if "Predicate_

可以让下面的示例工作吗

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

code_pred [show_modes] elems .

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

默认情况下,谓词编译器对有限集和成员操作符
|∈|。但是,如果添加以下代码段,则它可以工作

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)
这就是为什么这样做:常量
谓词\u Compile.contains
实现普通集合的枚举,谓词编译器知道它。带有属性
code\u pred\u intro
的引理告诉谓词编译器将
fset
上的成员资格视为一个归纳谓词,引理语句是引理规则。在
code\u pred
命令本身,您必须证明相应的消除规则。这两条规则(引入规则和消除规则)足以让谓词编译器进行模式分析,编译方程并证明它们是正确的

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

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