Form

私たちは一階言語を拡張し、数学の土台である集合とクラスを平易に扱えるようにします。一階言語での項に当たるものをs-Form、式に当たるものをp-Formとし、さらにc-Formを扱います。
Formのtex表記は【 】内にされます。phpではform_texによりFormのtex commandが計算されます。

Formはいくつかの形をとりますが、機械用のprefix形から説明します。そこで使用される記号はwordと呼ばれます。
特別なwordにvarがあり、ローマ字およびそれらに自然数が付いたものになります。例 \(x_0\)

gram

wordはgramというデータを持ちます。gram は (gram0, gram1) という形になります。
・gram0 … s,c,p の列か vp (vsとかも?)
・gram1 … s,c,p のどれか
また、arity : gram0の長さ、ただし gram0がvsかvp ⇒ arity : q とされます。
varは word(,s) です。var以外のword[arity : 0]はconstと呼ばれます。
例えば word(c,s) や word(p,s) は使用できません。基準はまだわかっていません…
word(,c)とword(s,p)は等価で、後者はほとんど使用されません。

var以外のwordは数学の教科書において次のように「紹介」されます。
word(ss,p) … \(=\)  
word(cc,p) … \(=\)  

prefix Form

Formは、wordの列で帰納的に作成されます。
・\({\tt w}\)がword[arity : \(n\)],  \({\tt F}_1,\cdots,{\tt F}_n\)がForm ⇒  \({\tt wF}_1\cdots{\tt F}_n\)がForm
・\({\tt w}\)がword[arity : q], \({\tt x}\)がvar, \({\tt F}\)がForm ⇒ \({\tt wxF}\)がForm

word[arity : 0] はそれだけでFormになります。例 【\(x\)
\([\;]\)を使うときは入れ子列としてみなされるので、例えば 【\(\neg \neg \top\)】\([1][0]\) = \(\neg\)

Formの中でもgramが正しく処理されているものには s-Form, c-Form, p-Form があります。それらの細かい規則として、例えば
・\({\tt w}\)がword(s,p),\({\tt S}\)がs-Form ⇒  \({\tt wS}\)がp-Form
【\(\neg P\)】はp-Formにはなっていません…【\(P\)】はs-Formなので。
また正確には
・\({\tt w}\)がword(vp,p), \({\tt x}\)がvar, \({\tt F}\)がp-Form ⇒ \({\tt wxF}\)がp-Form

表記法

arityが0でないwordは表記法データも持ちます。それは次の3種類のどれかになります。
 F ! 結合性(LかR)およびprecedの組
! は単独表記を持たないことを意味します。結合性は通常は L です。

word紹介時にgram以外では F ! R は明記されます。
word(vp,p)R … \(\forall\)  \(\exists\)  \(\exists!\)  

precedは大小関係に意味があります。デフォルトでは次の値になります。
 word[gram1 : sかc] … 300
 word[gram0 : s,c以外を含まない、gram1 : p] … 700
 word(vp,p) … 750
さらに
 \(\neg\) … 730
 \(\Rightarrow\) \(\Leftrightarrow\) … 770
 \(,\) \(\mathbin{\rm o\!r}\) … 780
 \(\Longrightarrow\) \(\Longleftrightarrow\) … 790

decent Form

wordと \((\) \(,\) \()\)の列で、読みやすい形を作ります。
word[arity : 2] はinfixにされます。例 【\(P , Q\)
表記法がFのword [arity : \(n\)] \({\tt w}\) は【\({\tt w}({\tt x}_1,\cdots,{\tt x}_n)\)】の形で使用されます。
後置もできます?

prefixへの変形によって等しくなることを ≈ で表します。
infixでは\((\;)\)が必要になりますが、precedの差を利用して略せることがあります。
例 【\(x = y \Rightarrow y = x\)】≈【\(( x = y ) \Rightarrow ( y = x )\)
例 【\(P \Rightarrow Q \Longleftrightarrow \neg P \mathbin{\rm o\!r} Q\)】≈【\(( P \Rightarrow Q ) \Longleftrightarrow ( ( \neg P ) \mathbin{\rm o\!r} Q )\)
内部ではdecent→post→prefixと計算されます。前の→は操車場アルゴリズムform_postにより計算されます。postの状態でparseしてから、post_preにより後の→を計算しています。

L結合性でprecedが等しいものは左から読まれます。例 【\(P , Q , R\)】≈【\(( P , Q ) , R\)
\(\forall\) はR結合性で 【\(\forall x \forall y P\)】≈【\(\forall x ( \forall y P )\)
なお、decentでは区別されますが、prefixでは次の同一視をして良いです。
 \(\Rightarrow\)\(\Longrightarrow\)
 \(\Leftrightarrow\)\(\Longleftrightarrow\)

優先順位はphpの記号にもあります。&& = and の順なので
$result = true && false;
var_dump($result); // bool(false)
$result = true and false;
var_dump($result); // bool(true) ←あれ?ってなる