Haskell で C コンパイラを作ってみた
- 2020/03/18 09:00
-
本エントリ投稿の 2, 3 ヶ月前に Haskell でスクラッチから x86-64 向けの C コンパイラを作った. 本エントリは, その記録である.
動機/背景
コンパイラの自作は, 社会人になる前に, 前々から一度はやっておきたいと思っていた事柄の一つであったこと, また関数プログラミングとの関係性について探求したかったこと, さらに, 一部には, 関数プログラミングはコンパイラ開発を容易にする1という認識があるが, 数学的構造の実用化の一つとも言える関数プログラミングに関する考察においては, 圏論的な理由付けによりその有用性を言うことができるはずであろうという, 私の中での何となくの予想が本当であるのかどうか, 確認したかったことから, 実際に Haskell で C コンパイラを作るに至った. なお, 圏論の話題は再度別のエントリとしてまとめ, その後, さらに別のエントリにそれと関連付いた話題としてまとめようと考えているため, 本エントリでは特に立ち入らず, あくまでも, Haskell で C コンパイラを作ってみたという単なる取り組みへの記録程度に止める.
ブール代数
- 2019/05/29 09:00
-
ブール代数は古典論理における命題論理と密接に関連している. 結論からいえば, 両者の違いは歴史的な背景ぐらいであり, 殆どの場合は同等の理論であるということができる1. ブール代数はその応用として論理回路の構築に直接役立つことから, 計算機科学, とくにハードウェアの分野において重宝される代数系の 1 つである.
ブール代数の公理とその定理
次に示すのはブール代数の公理系である. 公理系に関する詳細は証明理論 (TODO) の冒頭を参照のこと.
半順序集合 が可補分配束ならば, はブール代数である. すなわち, に対して, 次のすべての公理を満たした はブール代数である.
- :
- :
- : に対して . ここで は最大限, 単位元である. は最小限, 零元である.
- :
また, この からのみ成る集合をブール領域, ブール代数の下に書かれた式をブール式, 個のブール領域の引数をとり, 1 個のブール領域の値となる関数 をブール関数という. 例えば, 2 変数ブール関数 では がそれぞれ のいずれかとなるので, 通りの 2 変数ブール式が存在することとなる. 以下, 演算の優先順序は左結合性で の順とする. ただし, 括弧内の演算はより優先される.
さてブール代数の公理における乗法 と加法 , および をそれぞれ入れ替えると, 再びブール代数の公理である. これは双対の原理という公理である.
双対の原理
ブール代数で成立する文/式は, そこに現れるすべての をそれぞれ で置き換えても成立する.
これらの公理から補元の一意性, べき等律, 有界律, 吸収律, 結合律, 対合律, ド・モルガンの法則, シャノンの展開定理が導出可能である. 以下 とする.
関係 (集合論)
- 2019/03/15 09:00
-
関係 (集合論) について復習.
一般的な関係
いま, 二つの要素の順序体を と書くこととする. 他の異なる順序体 に対し, 以下の通り定義する.
このとき順序体の要素を 個に拡張したものを -tuple といい, 以下の通り定義する.
放物運動
- 2019/03/07 09:00
-
放物運動に関する復習と再現.
等加速度運動をする物体の位置関数の導出
時刻 における物体の位置を , 速度を とし, 加速度を考慮しない等速運動の三次元空間上の一点に対する位置関数 を とおく. このとき, 時間 から への変化量 を で割れば, 時間経過に対する物体の位置の対比が得られる. これは正しく速度のことであるが, これは時間 に位置 , 時間 に位置 にあった物体の平均速度である. いま時間 における物体の瞬間速度を知りたいとすると, が微小量となるように極限()を取れば良い.
最小二乗法で始めるカーブフィッティング
- 2019/01/03 09:00
-
要旨
本エントリー(WIP)はカーブフィッティング全般に関して記述したものであり, それぞれの原理, 性質について学んだ際のメモとして, より単純なものから広く浅く挙げています. 極力ないようにはしていますが, 本内容は独学で得た知見より書いておりますので, 一部正確さが欠けている可能性があることは否めません. 何かありましたら, コメント等で指摘していただけるとありがたいです. また, 本エントリ内における近似およびプロット等に関する実装は次のリポジトリ
にまとまっています.