是否有可能表达一个定理,说明哪些构造函数已被应用?

时间:2018-02-22 13:52:28

标签: coq

鉴于这种简单的语言和Inductive exp : Type := | lit : nat -> exp | add : exp -> exp -> exp . Inductive eval : exp -> nat -> Prop := | eval_lit: forall n, eval (lit n) n | eval_add0: forall e n, eval e n -> eval (add (lit 0) e) n | eval_add: forall e1 e2 n1 n2, ~(e1 = lit 0) -> eval e1 n1 -> eval e2 n2 -> eval (add e1 e2) (n1 + n2) . 定义:

eval (add e1 e2) e

我希望能够表达如果有一个有效的eval_add0形式实例,那么构造函数eval_addTheorem appplied_constructor: forall e1 e2, exists e, eval (add e1 e2) e -> (* either the constructor eval_add0 or eval_add had to be applied *). Proof. ... Qed. 已被使用。是否有可能做到这一点?如果是这样,那可证明吗?这是我想要实现的不完整代码:

 obj_fcath.get("list").getAsJsonArray().get(l).getAsJsonObject().get("rain").getAsJsonObject() 

1 个答案:

答案 0 :(得分:3)

您无法直接表达使用的构造函数,但您可以做的是从构造函数的类型向后工作,以确定使用该构造函数时所知道的内容。这正是反演策略的作用。您需要做的是手动说明您对z = zeros(n,1); for i = 1:n if Data{i}(1)~='N' z(i) = str2double(Data{i}); else z(i) = NaN; end end e1的了解,因为您拥有e2。例如:

eval (add ..) ..

你用Theorem appplied_constructor: forall e1 e2, (exists e, eval (add e1 e2) e) -> (e1 = lit 0) \/ (~e1 = lit 0 /\ exists n1 n2, eval e1 n1 /\ eval e2 n2). Proof. intros. destruct H as [e ?]. inversion H; subst; eauto 10. Qed. 说明了你的定理,所以我遵循了这种模式,并没有在结论中提到exists e。但是,您可以只说e而不是假设exists e, ...,然后再回头看forall e

e