3.3 Theorems

 述語論理のformulaに当たるtermのhol_typeは

`x+1

であり

`2+2=5`;;
val it : term = `2 + 2 = 5`

もhol_typeがboolのtermです.
 これまでの例からも判る通り,HOL Lightは入力されたtermを直ちには評価しません(Mathematicaなら
2+2は4,2+2=5はFalseと返すところです).評価にはその関数を明示して,例えば

REFL `x:real`;;
val it : thm = |- x = x

のようにします.これは,hol_typeがrealのterm xに反射律 REFL を適用して,|- x = xというthm(定理)を得たものです.
 数理論理と同じく,p1,...,pn|-pは,HOL Lightが知っているaxioms(公理)とrules(推論規則)および,仮定p1,...,pnからpが証明可能であることを表し,|-pは仮定なしでpが証明可能であるということです.仮定の付いたthmの簡単な例には,自分自身から自分を導く規則 ASSUME を用いた

ASSUME `1=2`;;
val it : thm = 1 = 2 |- 1 = 2

があります.
 termに対するsubstに当たる,thmに含まれる自由変数への代入関数が INST です.書き忘れていましたが,一般に関数の書式の確認には,引数なしで関数を呼びます.

subst;;
val it : (term * term) list -> term -> term =
INST;;
val it : (term * term) list -> thm -> thm =

この(term * term) listとは

[`1`,`(x:num)`];;

のようなlistであり,その要素は

(`1`, `(x:num)`)

というtermとtermの順序対で

let th1 = ASSUME `(x+1)+x=2`;;
val th1 : thm = (x + 1) + x = 2 |- (x + 1) + x = 2

に対して

INST [`1`,`(x:num)`] th1;;
val it : thm = (1 + 1) + 1 = 2 |- (1 + 1) + 1 = 2

のように用いますが,substとは異なり,代入できるのは変数に対してのみで,例えば

INST [`1`,`(x:num)+1`] th1;;
Exception: Failure "dest_var: not a variable".

と叱られます.
 thmの結論であるtermを取り出す関数がconcl関数であり,例えば

ASSUME`x=1`;;
val it : thm = x = 1 |- x = 1
concl it;;
val it : term = `x = 1`

のようになります.
 一般にHOL Lightは,証明そのものを出力しませんが,Proofrecordingディレクトリには,Coqのような外部システムへの変換ツールがあります.