鉴于这种简单的语言和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_add
或Theorem 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()
答案 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