5.3 Equational reasoning (2)
ここでSYMがどのように定義されているかを見るため,幾つか準備します.
・先の挙げたMPの等式版関数にEQ_MPがあり,それは A |- p ⇔ q と B |- p から A∪B |- q を得るもので
let e1=ARITH_RULE `1=1 <=> 1+1=2`;;
val e1 : thm = |- 1 = 1 <=> 1 + 1 = 2
let e2 =ARITH_RULE `1=1`;;
val e2 : thm = |- 1 = 1
EQ_MP e1 e2;;
val it : thm = |- 1 + 1 = 2
のように働きます.
・以下のような階層的な構成により,任意の深さの定義と表現が可能となります.
::= let
::=
|and
::= =
::=
|in
次の1つ目のxは大域変数,2つ目のxはin付きなので局所変数です.
let x = 1 and y = 2;
val x : int = 1
val y : int = 2
let x = 10 and y = 20 in x + y;;
val it : int = 30
x;;
val it : int = 1
なお,bindingは
let x,y = (1,2);;
val x : int = 1
val y : int = 2
let (x,y) = (`1`,`2`);;
val x : term = `1`
val y : term = `2`
のように変数のみではなく,より一般のpatternに対して可能です.
・AP_TERMは先に述べたMK_COMBと同等の働きですが
MK_COMB;;
val it : thm * thm -> thm =
AP_TERM;;
val it : term -> thm -> thm =
なので
MK_COMB( REFL`(*)1`,REFL`x:num` );;
val it : thm = |- 1 * x = 1 * x
AP_TERM `(*)1` (REFL`x:num`);;
val it : thm = |- 1 * x = 1 * x
のような違いがあります.
では,導出された推論規則であるSYMの定義を見ましょう
let SYM th =
let tm = concl th in
let l,r = dest_eq tm in
let lth = REFL l in
EQ_MP (MK_COMB(AP_TERM (rator (rator tm)) th,lth)) lth;;
各ステップを |- 1+1=2 から |- 2=1+1 を得る場合を例に実行して見ます.
# let th = ARITH_RULE`1+1=2`;;
val th : thm = |- 1 + 1 = 2
# let tm = concl th;;
val tm : term = `1 + 1 = 2`
# let l,r=dest_eq tm;;
val l : term = `1 + 1`
val r : term = `2`
# let lth = REFL l;;
val lth : thm = |- 1 + 1 = 1 + 1
# rator tm;;
val it : term = `(=) (1 + 1)`
# (rator (rator tm));;
val it : term = `(=)`
# AP_TERM it th;;
val it : thm = |- (=) (1 + 1) = (=) 2
# MK_COMB( it , lth );;
val it : thm = |- 1 + 1 = 1 + 1 <=> 2 = 1 + 1
# EQ_MP it lth;;
val it : thm = |- 2 = 1 + 1
以上を一気に行うのが
# th;;
val it : thm = |- 1 + 1 = 2
# SYM th;;
val it : thm = |- 2 = 1 + 1
と言うわけです.