证明一系列步骤终止

时间:2016-12-15 10:41:33

标签: coq lambda-calculus

我有一个重写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(); }); ?当假设被否定时,如何使用假设中的信息?

编辑:Here are more details about Term and Step

1 个答案:

答案 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.