Wiki
Clone wikiCafeOBJ / OSEK / contents / LK
古典論理シーケント計算
一般に,代数仕様からは項書換え系と呼ばれる実行環境が生成される. しかし,それにはいくつかの制限がある. 例えば,次のような等式のように, 等式の右辺や条件式に,等式の右辺に現れない変数が出現しているようなものは, 項書換え系に反映されない.
そこで,ここでは,CafeOBJで古典論理シーケント計算LKを部分的にシミュレートするための モジュールを紹介する.シーケントを用いれば,等式の右辺,左辺,条件式を1つの項として宣言できるので, 上に上げた制限は若干改善される.
#!python cq l(x) = r(x,y) if p(x,y,z)
PROPとPROPS
PROPは,命題を表すモジュールである. CafeOBJ処理系による簡約が意図を超えて行われることを防ぎ, 適宜拡張ができるように,真理値を表す内蔵モジュールBOOLを 拡張して定義している
#!python module PROP { signature { [ Bool < Prop ] op _and_ : Prop Prop -> Prop { assoc comm } op _or_ : Prop Prop -> Prop { assoc comm } op not_ : Prop -> Prop op _implies_ : Prop Prop -> Prop op _iff_ : Prop Prop -> Prop } axioms { vars P Q R : Prop eq false and P = false . eq true and P = P . eq P and P = P . eq true or P = true . eq false or P = P . eq P or P = P . eq not true = false . eq not false = true . eq not not P = P . eq P implies true = true . eq false implies P = true . eq P implies P = true . eq P iff Q = (P implies Q) and (Q implies P) . } }
PROPSは,命題の集合を宣言するモジュールである
#!python make PROPS ( SET(PROP { sort Elt -> Prop }) * { sort Set -> Props } )
SEQUENTとSEQUENTS
SEQUENTは,古典論理シーケント計算LKにおけるシーケントをソートSequentの項として定める. 但し,このモジュールで定めるシーケントには,命題しか現れない. シーケントのturnstyle(├ )の左右に置かれるのは命題の集合としている. これで,命題の配置を変える推論規則や重複する命題を除く推論規則を陽に記述せずに済む.
#!python module SEQUENT { imports { pr(PROPS) } signature { [ Sequent ] op _|-_ : Props Props -> Sequent } axioms { vars P : Prop vars L R : Props eq true,L |- R = L |- R . eq L |- R,false = L |- R . eq false,L |- R = false |- R . eq L |- R,true = L |- true . } }
SEQUENTSはシーケントの集合を表すモジュールである.
#!python make SEQUENTS ( SET(SEQUENT{ sort Elt -> Sequent }) * { sort Set -> Sequents } )
JUDGEMENT
JUDGEMENTは,シーケントの真偽を判定するためのものである.
#!python module JUDGEMENT { imports { pr(SEQUENTS) pr(RWL) } signature { op hold : Sequents -> Bool op hold : Prop -> Bool } axioms { vars P Q : Prop vars L R : Props vars S T : Sequents eq hold(nil |- nil) = false . eq hold(L |- true) = true . eq hold(false |- R) = true . eq hold(P,L |- R,P) = true . cq hold(L |- R,P) = true if hold(L |- R) = true . cq hold(L,P |- R) = true if hold(L |- R) = true . eq hold(nil) = true . eq hold(S,T) = hold(S) and hold(T) . cq hold(P) = true if P = true . cq hold(P) = true if hold(nil |- P) =(1,*)=>* true . } }
JUDGEMENTで宣言されている演算holdは, 与えられたシーケントが正しいか否かを計算する. 弱化(weakning)規則は,ここで宣言した条件付き等式に含まれる. holdは,シーケントの集合上の演算に拡張される. 任意の集合Sに対するhold(S)の値は,Sに属する全てのシーケントqが真であれば, すなわち,hold(q)が真であれば,真となる. また,holdは命題上の演算としても宣言される. 与えられた命題Pに対して シーケント ├ P を真に書換えることができるとき, hold(P)の値は真になる.
INFERENCE
モジュールINFERENCEでは,推論は項で表される.
#!python module INFERENCE { imports { ex(JUDGEMENT) } signature { [ Inference ] op antecedent : Inference -> Sequents op consequent : Inference -> Sequents op derivable : Inference -> Bool } axioms { vars I : Inference cq derivable(I) = true if antecedent(I) =(1,*)=>* consequent(I) . cq hold(consequent(I)) = true if derivable(I) and hold(antecedent(I)) . } }
RULE
モジュールRULEでは,推論規則を書換規則で宣言している.
#!python module RULE { imports { pr(SEQUENTS) } axioms { vars P Q : Prop vars L R : Props vars S T : Props rl (L,P |- R),(S |- P,T) => L,S |- R,T . rl L,P |- R => L |- (not P),R . rl (L |- P,R),(S |- Q,T) => L,S |- (P and Q),R,T . rl L |- P,Q,R => L |- (P or Q),R . rl L |- (P or Q),R => L |- P,Q,R . rl L,P |- Q,R => L |- (P implies Q),R . rl L |- P,R => L,(not P) |- R . rl L,P,Q |- R => L,(P and Q) |- R . rl L,(P and Q) |- R => L,P,Q |- R . rl (L,P |- R),(S,Q |- T) => L,S,(P or Q) |- R,T . rl (L |- P,R),(S,Q |- T) => L,S,(P implies Q) |- R,T . } }
LK
LKは,上に挙げたモジュールの和をとったものとなる.
#!python make LK ( INFERENCE + RULE )
Updated