2016-03-26 2 views
2

Я использую несколько определений Inductive в качестве примеров встречных примеров в некоторых доказательствах. Однако я хотел бы инкапсулировать эти определения, включив их в Section. Обычный Definitions можно скрыть с помощью Let, но это также возможно для Inductive определений? А как насчет Theorem?Локальные индуктивные определения и теоремы

Позвольте мне дать реальную вещь, которую я пытаюсь достичь, поскольку я, возможно, полностью ошибаюсь в первую очередь. Я хочу формализовать все доказательства и упражнения превосходной книги «Логика времени и вычислений» Роберта Голдблатта в Кок.

Для начала мы принимаем классическую логику, так как это и делает книга.

Require Import Classical_Prop. 
Require Import Classical_Pred_Type. 

Далее мы определяем идентификаторы так же, как это делается в Software Foundations.

Inductive id : Type := Id : nat -> id. 

Определение синтаксиса.

Inductive modal : Type := 
| Bottom : modal 
| V : id -> modal 
| Imp : modal -> modal -> modal 
| Box : modal -> modal 
. 

Definition Not (f : modal) : modal := Imp f Bottom. 

Определение семантики с использованием рамок Крипке.

(* Inspired by: www.cs.vu.nl/~tcs/mt/dewind.ps.gz 
*) 
Record frame : Type := 
{ Worlds : Type 
; WorldsExist : exists w : Worlds, True 
; Rel : Worlds -> Worlds -> Prop 
}. 

Record kripke : Type := 
{ Frame : frame 
; Label : (Worlds Frame) -> id -> Prop 
}. 

Fixpoint satisfies (M : kripke) (x : (Worlds (Frame M))) (f : modal) : Prop 
:= match f with 
| Bottom => False 
| V v => (Label M x v) 
| Imp f1 f2 => (satisfies M x f1) -> (satisfies M x f2) 
| Box f => forall y : (Worlds (Frame M)), (Rel (Frame M) x y) -> (satisfies M y f) 
end. 

Первая лемма относится модальное Not к одному из Coq.

Lemma satisfies_Not 
: forall M x f 
, satisfies M x (Not f) = ~ satisfies M x f 
. 
Proof. auto. 
Qed. 

Далее мы поднимаем семантику до полных моделей.

Definition M_satisfies (M : kripke) (f : modal) : Prop 
:= forall w : Worlds (Frame M), satisfies M w f. 

И мы покажем, что это значит для Not связки.

Lemma M_satisfies_Not : forall M f 
, M_satisfies M (Not f) -> ~ M_satisfies M f 
. 
Proof. 
    unfold M_satisfies. 
    intros M f Hn Hcontra. 
    destruct (WorldsExist (Frame M)). 
    specialize (Hn x); clear H. 
    rewrite satisfies_Not in Hn. 
    specialize (Hcontra x). auto. 
Qed. 

Здесь приходит вещь. Обратное из приведенной выше леммы не выполняется, и я хочу показать это с помощью встречного примера, демонстрируя модель, для которой она не выполняется.

Inductive Wcounter : Set := | x1:Wcounter | x2:Wcounter | x3:Wcounter. 

Lemma Wcounter_not_empty : exists w : Wcounter, True. 
Proof. exists x1. constructor. Qed. 

Inductive Rcounter (x : Wcounter) (y : Wcounter) : Prop := 
| E1 : x = x1 -> y = x2 -> Rcounter x y 
| E2 : x = x2 -> y = x3 -> Rcounter x y 
. 

Definition Lcounter : Wcounter -> id -> Prop 
:= fun x i => match x with 
| x1 => match i with | Id 0 => True | _ => False end 
| x2 => match i with | Id 1 => True | _ => False end 
| x3 => match i with | Id 0 => True | _ => False end 
end. 

Definition Fcounter : frame := Build_frame Wcounter Wcounter_not_empty Rcounter. 

Definition Kcounter : kripke := Build_kripke Fcounter Lcounter. 

Следующая Ltac, что избавляет меня от набрав многословные assert с.

Ltac counter_example H Hc := match type of H with 
| ?P -> ~ ?Q => assert(Hc: Q) 
| ?P -> (?Q -> False) => assert(Hc: Q) 
| ?P -> ?Q => assert(Hc: ~Q) 
end. 

Наконец я использую этот контрпример, чтобы доказать следующее Lemma.

Lemma M_not_satisfies_Not : ~ forall M f 
, (~ M_satisfies M f) -> M_satisfies M (Not f) 
. 
Proof. 
    apply ex_not_not_all. exists Kcounter. 
    apply ex_not_not_all. exists (V (Id 0)). 
    unfold M_satisfies. simpl. 
    intro Hcontra. unfold not in Hcontra. 
    counter_example Hcontra Hn2. 
    apply ex_not_not_all. exists x1. simpl. auto. 
    apply Hn2. apply Hcontra. apply ex_not_not_all; exists x2. simpl. auto. 
Qed. 

Предпочтительно я бы использовал remember тактику, чтобы определить пример счетчика внутри доказательства, но я не думаю, что он может быть использован для Inductive определений. Все определения, относящиеся к примеру счетчика, экспортируются как часть моей теории, которую я предпочитаю не делать. Он используется только в доказательстве M_not_satisfies_Not. На самом деле, я бы даже не хотел экспортировать этот Lemma, так как он не очень полезен. Я только ставил его там, чтобы утверждать, что M_satisfies_Not не может быть эквивалентом.

ответ

1

Section не скрывает определений, вместо этого используйте Module. Например, поставьте пример счетчика в модуль.

Module CounterExample. 
    Import Definitions. 
    Inductive Wcounter : Set := x1 | x2 | x3. 
    ... 
    Lemma M_not_satisfies_Not : ... 
End CounterExample. 

На данном этапе, только CounterExample определен на верхнем уровне.

Если вы этого не хотите, вы можете просто поместить определения в один файл .v и пример счетчика в другой файл, который импортирует определения. На самом деле, как это работает, файлы .v превращаются в отдельные модули.

Смежные вопросы