フォントの話の続きと見せかけて
2009年 12月 30日
もひとつ、頭を悩ませてくれたのが、バックスラッシュ・円記号問題です。「普通のテキスト」としての運用では、Unicodeテキストとその他のエンコードのテキストとの相互運用で問題が出てきます。こっちはまあ、純粋に円記号という意味の文字が使いたい場合、全角円記号¥を使えばいいだけですので、「日本語処理系」を基準に運用している人はこの回避策が取れます。
問題は、各種プログラミング言語での記号、エスケープ表現、セパレータ記号、などの特殊シンボルとしてバックスラッシュが使われている場合です。といっても、C言語や正規表現ではすでに、円記号を見かけても、それがエスケープ表現なんだと分かる人が多く、混乱することはあまりないと思いますし、ましてやMS OSのディレクトリセパレータは、日本ではむしろ、円記号の方が馴染みがありそうです。ですが、Prologとなると話は別なんですよね。
\= : not unifiable
\== : not equal
=\= : arithmetic not equal
\+ : logical not
\/ : bit and
/\ : bit or
\ : bit not
これのバックスラッシュを、円記号に置き換えてみると、分かりにくいと思うんじゃないかと。特に、bit and/or は、 ∩ / ∪ の記号をもとに作ってあると思われるので(否定全般がバックスラッシュということから 算術NotEQ もそうしたと思われるけど、これはスラッシュでもいいのにねぇ)。
そこで、このブログで、プログラムコードの例を記述していくにはどうしようか、という悩みが浮上したわけです。結論としては、可能な限り欧文フォントで逃げるのが最良という考えでいきます。
もっとも、今日的なPrologは演算子と数学関数を作るのが自由で、Unicodeソースが扱えるので、それらの記号を定義してしまえ、という考えもアリですかね。以下、SWI-Prologの例で。
∩(X,Y,R):-R is X /\ Y.
∪(X,Y,R):-R is X \/ Y.
:-arithmetic_function(∩/2).
:-arithmetic_function(∪/2).
:-op(500, yfx, ∩).
:-op(500, yfx, ∪).
と書いたソースを読ませておいて、
A is 2 ∩ 3,write(A),nl.
というコードを実行すると、
2
と出てきます。
SWI-Prologって、左右結合と優先順位を含めて、フルに演算子が定義できるので、ある種の式の「記述のスッキリさ」を求めるには悪くないと思います。ただし、算術演算を多数動作させる場合の速度がそんなに早くないので、本格的な「科学技術計算」(膨大な計算によって問題を解くこと)より、事務・業務に独特な演算子を定義して使うとか、簡単な数学の「数学らしい記述」をするためなどに向いていると思います。
また、Windows用バイナリ版として本家に置いてあるものは、多桁小数演算が可能なようにコンパイルされているので、BASICインタプリタを電卓代わりに使っていたことのある人なんかには、関数・演算子の拡張可能な日常的なインタプリタ型の多桁電卓として結構お奨めだったり(BASICよりクセが強いですけど)。
更に、上でなんの断りもなく使っている 'is' は、実は、右辺を算術評価して左辺とUnify(代入みたいなもの)する「演算子」ですが、そうではない評価演算子を独自に定義して使用することで、算術以外でも、たとえば集合演算だとか文字列演算をだとか、更にマニアックなこともできます(あくまで速度よりも「記述面」を求めるために)。まあ、ここで突っ込んでいってもややこしいので、またの機会に。
# by mikamikanamiyuki | 2009-12-30 00:24 | プログラミング