4 Propositional logic
HOL Lightの命題論理は一般的なものであり,命題定数は
F (Falsity)
T (Truth)
論理記号は
~ (Not)
さらに結合の強い順に
/\ (And)
\/ (Or)
==> (Implies)<=> (Iff)
で,同じ結合記号どうしは右結合,formula,および,truth valuesの設定もごく普通のものです.
前回のARITH_RULEのみでも,例えば
ARITH_RULE `x
のような証明が得られます.
HOL Lightの全ての中置き演算子の結合の強さ(数値が大きい程強い)と向きは
infixes();;
val it : (string * (int * string)) list =
[("<=>", (2, "right")); ("==>", (4, "right")); ("\\/", (6, "right"));
("/\\", (8, "right")); ("==", (10, "right")); ("===", (10, "right"));
("treal_eq", (10, "right")); ("IN", (11, "right")); ("<", (12, "right"));
("<<", (12, "right")); ("<<<", (12, "right")); ("<<=", (12, "right"));
("<=", (12, "right")); ("<=_c", (12, "right")); ("<_c", (12, "right")); ("=", (12, "right")); ("=_c", (12, "right")); (">", (12, "right"));
(">=", (12, "right")); (">=_c", (12, "right")); (">_c", (12, "right"));
("HAS_SIZE", (12, "right")); ("PSUBSET", (12, "right"));
("SUBSET", (12, "right")); ("divides", (12, "right"));
("treal_le", (12, "right")); (",", (14, "right")); ("..", (15, "right"));
("+", (16, "right")); ("++", (16, "right")); ("UNION", (16, "right"));
("treal_add", (16, "right")); ("-", (18, "left")); ("DIFF", (18, "left"));
("*", (20, "right")); ("**", (20, "right")); ("INTER", (20, "right"));
("treal_mul", (20, "right")); ("INSERT", (21, "right"));
("DELETE", (21, "left")); ("CROSS", (22, "right")); ("/", (22, "left"));
("DIV", (22, "left")); ("MOD", (22, "left")); ("div", (22, "left"));
("rem", (22, "left")); ("EXP", (24, "left")); ("pow", (24, "left"));
("$", (25, "left")); ("o", (26, "right"))]
のように得ることができます.OCaml(HOL Light)でのリストの書式は
[ e1 ; ... ; en ]
です(各要素は同じtype,詳しくは
http://www.i.kyushu-u.ac.jp/~bannai/ocaml-intro/basics.html
などを参照のこと).一つの演算子の情報を得るだけなら,演算子名をstringとして指定して
get_infix_status "==>";;
val it : int * string = (4, "right")
とします.もし,この設定を変更したり,新たな結合子に強さと向きを与えたいなら
parse_as_infix("+",(1,"left"));;
val it : unit = ()
とすればよいのですが,これでは < のほうが強いので ( x < x ) + 1 となり叱られます.
`x < x + 1`;;
Exception: Failure "unify: types cannot be unified".
なお,複数の結合子については
`x
のように駄目ですが
`(p ==> q)==>r`;;
val it : term = `(p ==> q) ==> r`
`p ==> (q==>r)`;;
val it : term = `p ==> q ==> r`
のように大丈夫なものもあります(上記の通り右結合).