我有一个重写lambda术语的小系统。它具有通常的(三个)确定性的按值调用重写规则。我没有在这里列出它们。
重写被建模为Step
从一个Term
到另一个StarStep
。我还有可到达术语之间的Variable Term: Type.
Variable Step: Term -> Term -> Prop.
Inductive StarStep: Term -> Term -> Prop :=
| StepNone : forall t, StarStep t t
| StepOne : forall t t', Step t t' -> forall t'', StarStep t' t'' -> StarStep t t''.
Goal forall t : Term,
~ (forall t', StarStep t t' -> exists t'', Step t' t'') ->
exists t', StarStep t t' /\ forall t'', ~ Step t' t''.
关系,后者可以通过零或更多重写步骤从第一个生成。
我现在想要显示重写终止(使用值或卡住)。我已经删除了细节,因为我不认为它们在这里很重要,但我可以根据需要添加更多细节。
以下是代码(或浏览器中 CollaCoq 中的here):
t'
所以我想要展示
如果不是所有可达状态的"都是可能的 另一步" 然后存在可从
t
到达的州t
因此无法从中采取措施。
我被困在如何继续。我是否需要更多信息,即归纳或破坏(=案例分析)$("a.button").on("click",function(){
$(this).parent().hide();
$(this).parent().next().show();
});
?当假设被否定时,如何使用假设中的信息?
答案 0 :(得分:4)
我相信这是经典推理的一个例子。 该陈述类似于以下命题,在建设性环境中无法证明:
Goal forall (A : Type) (P : A -> Prop),
~ (forall x, P x) -> exists x, ~ P x.
因为知道“forall ......不是真的......”并不会产生一个你需要证明某物存在的物体。
这是一个使用经典逻辑定律的可能解决方案:
Require Import Coq.Logic.Classical_Pred_Type.
Require Import Coq.Logic.Classical_Prop.
Goal forall t : Term,
~ (forall t', StarStep t t' -> exists t'', Step t' t'') ->
exists t', StarStep t t' /\ forall t'', ~ Step t' t''.
Proof.
intros t H.
apply not_all_ex_not in H.
destruct H as [tt H].
apply imply_to_and in H.
firstorder.
Qed.
实际上,我们甚至不需要了解StarStep
的任何内容,因为以前的命题的以下抽象版本在经典逻辑中是有效的(证明保持不变):
Goal forall (A : Type) (P Q : A -> Prop),
~ (forall s, Q s -> exists t, P t) ->
exists s, Q s /\ forall t, ~ P t.