fresh vs forall
tm : type. step : tm -> tm -> type. sn : tm -> type. sn_ : ({U:tm} step T U -> sn U) -> sn T. lem : (sn T) -> (step T U) -> (sn U) -> type. %mode lem +D1 +D2 -D3. lem_pr : lem (sn_ Pred : sn T) (StepTU : step T U) (Pred U StepTU). %terminates {} (lem _ _ _).
まずそもそもの所、これで上手くやりたい事が出来ているのかどうか分からないのですが・・・。
話の発端は、
http://www2.tcs.ifi.lmu.de/~abel/entcs04.pdf
のp11
For the same reason, Tait’s proof cannot be formalized directly in Twelf.
と、p12
Due to the interpretation of quantification in Twelf
の辺りなのですが、上記の通りにやってあげれば良いんじゃないのかしらとしか思えなくて、何がどう・・・どうなってるんだろう。
Twelfでまんまencodeしたものは、universal quantificationではなくてfreshに成る、したがってmathematical languageに書き戻した時に元とは違って来てしまいますよ、と書いているのですが、何か困る事が起こるのかしら?
そして何故、freshになってしまうのか?というのが分からない所です。
上でやっている事は、Strong Normalizationのformalize(これがsnとsn_.sn_が特にinductiveなruleの代わり)のつもりで、lemは項Tが強正規化可能であり、Tを1-step reductionすると項Uが得られる時、項Uもまた強正規化可能である つまり、強正規化可能はreductionのもとで閉じている を試しに証明した感じになっています。(つもりです...
しかしTwelfが分からないぽん!!
Agda2で書くと
module SN where data Tm : Set0 where c : Tm app : Tm -> Tm -> Tm abs : Tm -- 面倒臭いのでパス (Tm -> Tm) -> TmでFull HOASぽくやるとnegative data Unit : Set0 where unit : Unit -- 1-step reductionのつもり step : Tm -> Tm -> Set0 step a b = Unit -- Strong Normalizationの定義 {- ∀n.(step m n) → SN n ---------------------- SN m -} data SN1 (m : Tm) : Set0 where sn1 : ((n : Tm) -> (step m n) -> SN1 n) -> SN1 m -- ∀m n.(SN m) ∧ (step m n) → SN n th1 : {m n : Tm} -> SN1 m -> (step m n) -> SN1 n th1 {m} {n} (sn1 p) s = p n s where p' : (o : Tm) -> (step m o) -> SN1 o p' = p {- (step m n) → SN n ------------------ SN m -} -- この定義だと項nがerasureされちゃうので -- ∀m n.(SN m) ∧ (step m n) → SN n -- は証明出来なく成ってしまう data SN2 (m : Tm) : Set0 where sn2 : (n : Tm) -> ((step m n) -> SN2 n) -> SN2 m th2 : {m n : Tm} -> SN2 m -> (step m n) -> SN2 n th2 {m} {n} (sn2 .n p) s = p' s' where p' : (step m n) -> SN2 n p' = p s' : step m n s' = s
こうなるはずで、このSN1とSN2に相当するものをTwelfで書いて、SN2でformalizeしても何か証明出来そうな予感がして、実際に出来ると不味いとかそんな感じなのか・・・しら・・・?
むしろそれよりはSN1にsyntax的な意味でそのまま落として、それが何故か証明出来ないとかの方が必要な話なのではないかしら。
Twelfでやってみる
tm : type. step : tm -> tm -> type. sn : tm -> type. sn_ : {T:tm} ({U:tm} step T U -> sn U) -> sn T. sn2 : {T:tm} {U:tm} (step T U -> sn U) -> sn T. lem : (sn T) -> (step T U) -> (sn U) -> type. %mode lem +DSnT +DStepTU -DSnU. lem_hoge : lem (sn_ T Pred : sn T) (StepTU : step T U) (Pred U StepTU : sn U). lem_hoge2 : lem (sn2 T U Pred : sn T) (StepTU : step T U) (Pred StepTU : sn U).
何か明らかに違うような気がするのですが。。。
これをTwelf Serverに投げると
lem_hoge : {T:tm} {U:tm} {Pred:{x:tm} step T x -> sn x} {StepTU:step T U} lem (sn_ T ([U1:tm] [x:step T U1] Pred U1 x)) StepTU (Pred U StepTU). lem_hoge2 : {T:tm} {U:tm} {Pred:step T U -> sn U} {StepTU:step T U} lem (sn2 T U ([x:step T U] Pred x)) StepTU (Pred StepTU).
とかに成っていて、素直にパターンマッチ相当をするにはどうすれば良いんだろう。