<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Migdal: ぐらふぃーむ</title>
    <description>The latest articles on Migdal by ぐらふぃーむ (@graphemecluster).</description>
    <link>https://migdal.jp/graphemecluster</link>
    <image>
      <url>https://migdal.jp/uploads/user/profile_image/251/35122bd6-0648-4d3e-aa5b-25b98f5c36dc.png</url>
      <title>Migdal: ぐらふぃーむ</title>
      <link>https://migdal.jp/graphemecluster</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://migdal.jp/feed/graphemecluster"/>
    <language>en</language>
    <item>
      <title>数式をロジバンに変換するプログラムを作ってみた（前編）</title>
      <dc:creator>ぐらふぃーむ</dc:creator>
      <pubDate>Mon, 18 Dec 2023 15:59:19 +0000</pubDate>
      <link>https://migdal.jp/graphemecluster/%E6%95%B0%E5%BC%8F%E3%82%92%E3%83%AD%E3%82%B8%E3%83%90%E3%83%B3%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E5%89%8D%E7%B7%A8-54p0</link>
      <guid>https://migdal.jp/graphemecluster/%E6%95%B0%E5%BC%8F%E3%82%92%E3%83%AD%E3%82%B8%E3%83%90%E3%83%B3%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E5%89%8D%E7%B7%A8-54p0</guid>
      <description>&lt;p&gt;これは「&lt;a href="https://adventar.org/calendars/8540"&gt;語学・言語学・言語創作 Advent Calendar 2023&lt;/a&gt;」の 18 日目の記事です。&lt;/p&gt;

&lt;p&gt;こんにちは、初めてアドカレに参加させていただいたぐらふぃーむです。&lt;/p&gt;

&lt;p&gt;Migdal で記事を投稿するのも初めてということで、まず香港でお馴染みのアニメキャラクターのマクダル (McDull) （麥 (mak6 ) 兜 (dau1)  /mɐ̀k̚.tɐ́w/）を供養します&lt;sup id="fnref1"&gt;1&lt;/sup&gt;：&lt;/p&gt;

&lt;p&gt;
  .text-styles .table-wrapper-paragraph-multicolumn {
    width: 100%;
    margin: 0 0 var(--content-rhythm) 0;
  }
  .migdal-mc-table, .migdal-mc-tbody, .migdal-mc-tfoot, .migdal-mc-thead, .migdal-mc-tr {
    display: block;
  }
  .migdal-mc-td, .migdal-mc-th {
    display: table-cell;
    /* copied from table styles */
    padding: var(--su-2);
    border-style: solid;
    border-color: var(--base-20);
    border-width: 1px 0 0 1px;
  }
  .migdal-mc-td:last-child, .migdal-mc-th:last-child {
    border-right-width: 1px;
  }
  .migdal-mc-tbody &amp;gt; .migdal-mc-tr:last-child &amp;gt; .migdal-mc-td,
  .migdal-mc-tbody &amp;gt; .migdal-mc-tr:last-child &amp;gt; .migdal-mc-th {
    border-bottom-width: 1px;
  }
  .migdal-mc-th {
    font-weight: bold;
    /* copied from table styles */
    background: var(--body-bg);
  }

&lt;/p&gt;
&lt;div&gt;
  &lt;img src="https://migdal.jp/uploads/articles/m0mh0tbqrwh1dj9bnj3q.png" alt="麥兜" width="531" height="737"&gt;
&lt;/div&gt;



&lt;p&gt;すべての表現は自然言語で述べている以上曖昧さを生じかねません。人工言語で書けば解決できると思うかもしれませんが、一般的な文は構造的な多義性のない人工言語で書くとしても語彙的な多義性は完全に排除できるわけではありません。そこで、数学のような厳密な分野なら意味論での曖昧さはないので、完璧に曖昧さのない文が作れるのではと思い、今回は Mathematica というパワフルな数学ソフトで入力された数式をその場でロジバンの表記に変えられるプログラムを書いてみました。&lt;/p&gt;

&lt;p&gt;プログラムは主にロジバン大全（The Complete Lojban Language）という本のコミュニティ版&lt;sup&gt;[&lt;a href="https://la-lojban.github.io/uncll/uncll-1.2.15/cll.pdf"&gt;PDF&lt;/a&gt;]&lt;/sup&gt;の第 18 章を参考に作っています。&lt;/p&gt;

&lt;p&gt;技術に偏りすぎないよう、Wolfram 言語（後述）の関数や演算子などの説明の割愛は多々あります（それでも随分偏ってますが）。ご了承ください。&lt;/p&gt;

&lt;p&gt;もしこの記事に誤字・脱字やおかしな表現、それとこの記事に対するご意見があれば、是非コメント欄で教えてください！&lt;/p&gt;

&lt;p&gt;では本文に入りましょう。&lt;/p&gt;
&lt;h2&gt;
  
  
  概要
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ロジバンについて
&lt;/h3&gt;

&lt;p&gt;周知のように、Lojban は世界で最も有名な人工言語の一つであり、文法的な曖昧を排除しつつ柔軟性を持たせるように、そして何よりコンピューターも人間も容易に理解できるように設計されています。また、重要な性質として、ロジバンで書かれた文はすべて述語論理の命題として解釈しうるので、数学的記法で書き換えることもできます。&lt;/p&gt;
&lt;h3&gt;
  
  
  Mathematica とは
&lt;/h3&gt;

&lt;p&gt;Mathematica は、ロジバンが１歳を迎えた 1988 年に初めてリリースされた数式処理システムです。機能は多岐にわたり、数学に限らず、科学、天文学、地理学から自然言語処理を含む機械学習にまで、幅広く応用されています。Mathematica は Wolfram Language というプログラミング言語を使って様々な操作を利用できます&lt;sup id="fnref2"&gt;2&lt;/sup&gt;。Wolfram Alpha も Mathematica の上に構築されているし、Mathematica で制限なく Wolfram Alpha にアクセスできます（今回は使いませんが）。ドキュメントもとても豊富で、（英語から）日本語（と中国語のみ）に 100% 翻訳されています。&lt;/p&gt;

&lt;p&gt;例を挙げるとバブルソートはわずか１行で実装できます&lt;sup id="fnref3"&gt;3&lt;/sup&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight mathematica"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;//.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="o"&gt;___,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="o"&gt;_,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="o"&gt;_,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;k&lt;/span&gt;&lt;span class="o"&gt;___&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;k&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;(* = {1, 2, 3, 4, 5, 6} *)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;「6・3・4・2・5・1」という配列を、「任意の長さの要素によるシーケンス x・要素 y・要素 z・任意の長さの要素によるシーケンス k」でできた配列のうち y &amp;gt; z の場合に限り「シーケンス x・要素 z・要素 y・シーケンス k」に繰り返して置き換える&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;もちろん、ビルトインの関数は 6000 個を超えていますので、ソートを自分で実装する必要はありません。&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Q&amp;amp;A: Wolfram Language ではなく他の言語で書けばずっと楽勝なのでは？
&lt;/h3&gt;

&lt;p&gt;全くもってそうです。とても大変でしたが、自分の慣れ親しんだ TypeScript ⊃ ECMAScript (JavaScript) よりも慣れる余地のある Wolfram Language でやった方がたくさん学べるし、ビルトインで数式を入力できる数学ソフトでやりたかったので。あと楽しかったので無問題。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  下準備
&lt;/h2&gt;

&lt;p&gt;前置きはこれくらいにして、実践していきたいと思います。&lt;/p&gt;

&lt;p&gt;大雑把に言うと、構造を取得して再帰で式を変換していく作業をしていきます。構文を評価（Evaluate）しないようにするには &lt;code&gt;Hold&lt;/code&gt;、完全形にするには &lt;code&gt;FullForm&lt;/code&gt; を、可視化するには &lt;code&gt;TreeForm&lt;/code&gt; を使います&lt;sup id="fnref4"&gt;4&lt;/sup&gt;：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/pwqqloxnx7zm3fvis2nu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/pwqqloxnx7zm3fvis2nu.png" alt="式" width="1936" height="926"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/8743069c-badf-49dc-b316-41333c914e15" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/8743069c-badf-49dc-b316-41333c914e15/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/8743069c-badf-49dc-b316-41333c914e15" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;ここで問題が発覚されました。Mathematica では引き算と割り算はそれぞれ「a + -1 × b」と「a × b⁻¹」の形に自動的に置き換えられることが分かります。単項マイナス演算も同じく、-1 を掛ける形に置き換えられます。これを解決するためには、計算を影響しない中継の形式に上書きします。ここは厄介なところがあまりにも多く、話をしすぎると趣旨から離れちゃいますので、後日技術記事に特化した Qiita で解説したいと思います。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/1g134w0d14v6i79fgyk9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/1g134w0d14v6i79fgyk9.png" alt="式" width="1936" height="1201"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/b696e39f-6b96-42b6-bcf0-5bee1aaa1879" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/b696e39f-6b96-42b6-bcf0-5bee1aaa1879/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/b696e39f-6b96-42b6-bcf0-5bee1aaa1879" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;これを書くだけですごく時間かかってしまって大変でした。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;追記：&lt;/strong&gt;しかしこのハックにも盲点がある。「計算を影響しない」ようにしていますので、下の「計算させよう」の節が示したように、評価した出力はこの中継の形に置き換えることはありません。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  数をロジバンに
&lt;/h2&gt;

&lt;p&gt;ここからが本番です。まずは数をロジバンの読みに変えましょう。&lt;br&gt;
まずは小数を扱います。&lt;code&gt;RealDigits&lt;/code&gt; を使うと桁を取り出すことができ、整数部分と小数部分の切れ目も教えてくれますので、&lt;code&gt;TakeDrop[list, index]&lt;/code&gt; を使って配列を分割します（Wolfram 言語では配列の要素は１から数えます。後述）。&lt;code&gt;%&lt;/code&gt; は直前の出力結果を表します：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/q3bjaw27ex7xa1q6mmtb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/q3bjaw27ex7xa1q6mmtb.png" alt="式" width="687" height="201"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/0d9b8ace-9b36-4db7-921d-5cb5e60114a0" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/0d9b8ace-9b36-4db7-921d-5cb5e60114a0/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/0d9b8ace-9b36-4db7-921d-5cb5e60114a0" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;しかし末尾に０が生えてしまうことが分かります。さらにいくつかの例を試すと、切れ目は負の数もあれば、配列の長さを超えることもあります：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/v8y4s4tv5d1im9ytx49f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/v8y4s4tv5d1im9ytx49f.png" alt="式" width="1238" height="306"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/a4b55560-a6d8-40bc-b522-6e3e710a9c74" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/a4b55560-a6d8-40bc-b522-6e3e710a9c74/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/a4b55560-a6d8-40bc-b522-6e3e710a9c74" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;これらを解決するためには、配列を &lt;code&gt;ArrayPad&lt;/code&gt; で適宜に０を充填・削除し、インデックスを負でない数に制限します：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/cm0pin2jzw4omqpyoqqy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/cm0pin2jzw4omqpyoqqy.png" alt="式" width="1867" height="287"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/c15b7e18-7d49-4c11-bf53-3ba6d4841a68" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/c15b7e18-7d49-4c11-bf53-3ba6d4841a68/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/c15b7e18-7d49-4c11-bf53-3ba6d4841a68" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;次に、&lt;code&gt;Partition&lt;/code&gt; で各部分をそれぞれ３桁ずつ分けます。整数部分は右寄せ（-1）、小数部分は左寄せ（1）です：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/vbekxw9b40zdy2b0914g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/vbekxw9b40zdy2b0914g.png" alt="式" width="1150" height="105"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/4b2213ae-fbbc-4e72-9036-26391d77840a" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/4b2213ae-fbbc-4e72-9036-26391d77840a/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/4b2213ae-fbbc-4e72-9036-26391d77840a" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;ロジバン大全（CLL）の 18.7 節より、分けた各グループの先頭のゼロは省略できます……としていますが、小数部分に４桁以上（２グループ以上）ないと ki'o は入らないので、0.1 と 0.001 を区別するためにゼロは省略できません。言い換えると、ki'o の後ろにくる no は消去できますが、小数部分に ki'o がない限り pi の後ろにくる no は消去できません。このルールに従ってゼロを消します：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/7u2b9w3nehzphxc2i3c1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/7u2b9w3nehzphxc2i3c1.png" alt="式" width="1742" height="137"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/08d235d1-b876-45b5-b94a-b16676fdddd8" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/08d235d1-b876-45b5-b94a-b16676fdddd8/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/08d235d1-b876-45b5-b94a-b16676fdddd8" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;最後に各桁をロジバンにしてセパレーターを入れれば概ね完成です（10~19 の桁の名前は今後のために残しておきます）：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/jayfn91zvdim0dderfym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/jayfn91zvdim0dderfym.png" alt="式" width="1872" height="213"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/cc4f8010-0370-44a9-ab94-ce245a111f8b" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/cc4f8010-0370-44a9-ab94-ce245a111f8b/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/cc4f8010-0370-44a9-ab94-ce245a111f8b" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;{Re[z], Im[z]}&lt;/code&gt; を返す &lt;code&gt;ReIm[z]&lt;/code&gt; を使えば、複素数もそのままいけます：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/0h0kljz77yhw3rnszik1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/0h0kljz77yhw3rnszik1.png" alt="式" width="1872" height="167"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/8aee725f-7b35-48aa-853a-2162b263ab39" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/8aee725f-7b35-48aa-853a-2162b263ab39/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/8aee725f-7b35-48aa-853a-2162b263ab39" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;式がやや乱れているので整理し関数化するとすっきりします：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/egil4eyr8oc5bw9j5zb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/egil4eyr8oc5bw9j5zb7.png" alt="式" width="1624" height="590"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/e18480a6-c3d0-4419-be47-9168444c63b7" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/e18480a6-c3d0-4419-be47-9168444c63b7/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/e18480a6-c3d0-4419-be47-9168444c63b7" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;ロジバン大全には「演算子には優先順位はない」と明記しましたが、この部分から筆者が勝手に優先順位を「ka'o &amp;gt; fi'u = pi &amp;gt; ki'o」と指定したことが分かります。そもそも順位がないのは VUhU 類の方だけで PA 類には何も言っていないと思います。（間違ったらコメント欄で教えてください！）&lt;/p&gt;

&lt;h2&gt;
  
  
  変数と定数をロジバンに
&lt;/h2&gt;

&lt;p&gt;愚直に文字毎に変換する関数を書きます&lt;sup id="fnref5"&gt;5&lt;/sup&gt;。&lt;code&gt;Characters&lt;/code&gt; は文字列を分解し配列にして返す関数です：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/f2xecrwwjnolfjh6il9i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/f2xecrwwjnolfjh6il9i.png" alt="式" width="1791" height="198"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/0ae43367-bb35-4a88-b1ce-ff65052749b5" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/0ae43367-bb35-4a88-b1ce-ff65052749b5/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/0ae43367-bb35-4a88-b1ce-ff65052749b5" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;ここで二つの問題点が見られます：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;大文字を処理していない&lt;/li&gt;
&lt;li&gt;ピリオドが連続する&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;そこで &lt;code&gt;SequenceReplace&lt;/code&gt; で並ぶ大文字を「ga'e …… to'a」で囲んで &lt;code&gt;StringReplace&lt;/code&gt; で連続するピリオドを一つにします：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/g7ofcd5l4iwwctauvinx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/g7ofcd5l4iwwctauvinx.png" alt="式" width="1674" height="242"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/62452af7-4e89-44d0-86b4-57405450c4f0" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/62452af7-4e89-44d0-86b4-57405450c4f0/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/62452af7-4e89-44d0-86b4-57405450c4f0" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;あとは定数も処理します。CLL で名前が定義されたものであればそのまま使い、それ以外は上記の関数で名前を出します：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/ebyw86gub3uuigf5pv92.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/ebyw86gub3uuigf5pv92.png" alt="式" width="1202" height="322"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/d08418cb-685c-44a4-85d2-cdd376837960" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/d08418cb-685c-44a4-85d2-cdd376837960/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/d08418cb-685c-44a4-85d2-cdd376837960" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  構文を解析する
&lt;/h2&gt;

&lt;p&gt;Wolfram 言語で構文を扱えるようにするには一つのコンセプトを理解する必要があります：&lt;/p&gt;

&lt;p&gt;すべての式は頭部（Head）と要素（引数、パラメータとも）でできています。例えば &lt;code&gt;f[x, y]&lt;/code&gt; の頭部は &lt;code&gt;f&lt;/code&gt;、要素は &lt;code&gt;x&lt;/code&gt; と &lt;code&gt;y&lt;/code&gt; です。頭部は定義されない限り何も行いませんので、&lt;strong&gt;単にラベルに過ぎません&lt;/strong&gt;。このように未定義の頭部を使うのはよくあることです。なお配列の頭部は &lt;code&gt;List&lt;/code&gt; なので、&lt;code&gt;{x, y, z}&lt;/code&gt; の完全形は &lt;code&gt;List[x, y, z]&lt;/code&gt; になります。&lt;/p&gt;

&lt;p&gt;各成分を取り出すには &lt;code&gt;……[[n]]&lt;/code&gt; を使います。第０要素は頭部、第１以降が引数です。よって &lt;code&gt;{x, y, z}[[1]]&lt;/code&gt; と &lt;code&gt;(x + y + z)[[1]]&lt;/code&gt; はいずれも &lt;code&gt;x&lt;/code&gt; です。なぜなら &lt;code&gt;x + y + z&lt;/code&gt; の完全形は &lt;code&gt;Plus[x, y, z]&lt;/code&gt; で、二つの式の違いは頭部にしかありません。&lt;code&gt;……[[0]]&lt;/code&gt; と &lt;code&gt;……[[1]]&lt;/code&gt; はそれぞれ &lt;code&gt;Head[……]&lt;/code&gt; と &lt;code&gt;First[……]&lt;/code&gt; に等しいです。また、&lt;code&gt;exp = f[g[a, b, c]]&lt;/code&gt; とすると、&lt;code&gt;exp[[1, 0]]&lt;/code&gt; は &lt;code&gt;g&lt;/code&gt;、&lt;code&gt;exp[[1, 1]]&lt;/code&gt; は &lt;code&gt;a&lt;/code&gt; になります：&lt;sup id="fnref6"&gt;6&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/f9vffcgznijvp6qhdz4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/f9vffcgznijvp6qhdz4j.png" alt="式" width="1950" height="422"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/ba1c83f2-a301-4e18-b617-d1a26a26c8b8" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/ba1c83f2-a301-4e18-b617-d1a26a26c8b8/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/ba1c83f2-a301-4e18-b617-d1a26a26c8b8" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;それでは &lt;code&gt;mekso&lt;/code&gt;（ロジバンで「数式」）という関数を考えます。&lt;code&gt;mekso&lt;/code&gt; に与えた式が評価されないよう二つの措置を取る必要があります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mekso&lt;/code&gt; に処理される&lt;strong&gt;前&lt;/strong&gt;に評価されないよう &lt;code&gt;mekso&lt;/code&gt; 自体に &lt;code&gt;HoldAll&lt;/code&gt; という属性を適用します。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mekso&lt;/code&gt; に処理される&lt;strong&gt;途中&lt;/strong&gt;で誤って評価されないよう初っ端から与えた式を &lt;code&gt;Hold&lt;/code&gt; で囲みます。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;次に、&lt;code&gt;Hold&lt;/code&gt; で囲まれた式をどうするかを考えます。最初はシンプルに &lt;code&gt;1 + 1 == 2&lt;/code&gt; から始まりましょう。&lt;/p&gt;

&lt;p&gt;一旦、式の完全形を出力するように書いて、後で上書きします：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/c3lxkw8hhfa4fwxuk6g7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/c3lxkw8hhfa4fwxuk6g7.png" alt="式" width="1937" height="231"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/e4202bfc-6bbb-430e-9384-bc2bebfb46b0" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/e4202bfc-6bbb-430e-9384-bc2bebfb46b0/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/e4202bfc-6bbb-430e-9384-bc2bebfb46b0" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;どの演算を行うのは頭部によって決まりますので、まず頭部を抽出します。しかし &lt;code&gt;Hold&lt;/code&gt; もまた一つの式なので &lt;code&gt;Head[exp]&lt;/code&gt; は &lt;code&gt;Hold&lt;/code&gt; になってしまいます。そこで、本当の中身の頭部を取り出すには &lt;code&gt;exp[[1, 0]]&lt;/code&gt; を使います。稀に頭部は評価する余地がありますので、特別に &lt;code&gt;exp[[1, 0]]&lt;/code&gt; ではなく &lt;code&gt;Extract[x, {1, 0}, Hold]&lt;/code&gt; を書くことで、頭部を取り出すことと同時に &lt;code&gt;Hold&lt;/code&gt; で囲みます。これを &lt;code&gt;head&lt;/code&gt; 関数として定義します：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/usz58fzbtk2z48o9nbgq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/usz58fzbtk2z48o9nbgq.png" alt="式" width="1937" height="284"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/7d946f64-3a4d-448d-b27e-6f8b3edb0157" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/7d946f64-3a4d-448d-b27e-6f8b3edb0157/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/7d946f64-3a4d-448d-b27e-6f8b3edb0157" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;次に各要素も抽出します。同様に &lt;code&gt;Hold&lt;/code&gt; で囲む必要があります。つまり &lt;code&gt;Hold[f[x, y, z]]&lt;/code&gt; を &lt;code&gt;{Hold[x], Hold[y], Hold[z]}&lt;/code&gt; に変えられる関数を考えます。そこで &lt;code&gt;@@@&lt;/code&gt;&lt;sup id="fnref7"&gt;7&lt;/sup&gt; で中身の頭部を配列（リスト）に置き換えて &lt;code&gt;Distribute&lt;/code&gt; で分配します（&lt;code&gt;Distribute&lt;/code&gt; は元々「a × (b + c)」を「a × b + a × c」に展開する（分配法則の適用という）のに使う関数です）。これを &lt;code&gt;oprands&lt;/code&gt; 関数として定義します：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/3xgftvt591keeutfq7je.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/3xgftvt591keeutfq7je.png" alt="式" width="698" height="246"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/e4314fd6-d78a-43ce-a3d8-1407ca31906a" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/e4314fd6-d78a-43ce-a3d8-1407ca31906a/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/e4314fd6-d78a-43ce-a3d8-1407ca31906a" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;成分を取得する関数があったら、後は頭部に応じて式を変換するだけです。最後に配列を平坦化（フラット化）し各要素の間に空白文字を入れます：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/9ftywo1fh7hc3q9sc3qi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/9ftywo1fh7hc3q9sc3qi.png" alt="式" width="1354" height="338"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/7ad5626b-8a0c-4c35-9d0e-d623de678af5" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/7ad5626b-8a0c-4c35-9d0e-d623de678af5/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/7ad5626b-8a0c-4c35-9d0e-d623de678af5" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;このように演算子を種類に応じて分類し追加していけばほぼ完成です：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/qrdwvbmatlax0etlwhp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/qrdwvbmatlax0etlwhp3.png" alt="式" width="1815" height="608"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/9115d543-157c-4d37-90dd-fa21393e97c9" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/9115d543-157c-4d37-90dd-fa21393e97c9/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/9115d543-157c-4d37-90dd-fa21393e97c9" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;では試してみましょう：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/viki8jb34xl2nnc6ai9s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/viki8jb34xl2nnc6ai9s.png" alt="式" width="1614" height="299"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/1544eac9-60eb-41b4-a052-9d7e212d647b" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/1544eac9-60eb-41b4-a052-9d7e212d647b/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/1544eac9-60eb-41b4-a052-9d7e212d647b" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;ここで、そのまま平坦化してはいけないことが分かります。構造を括弧に該当する「vei …… ve'o」で囲む必要があります。&lt;/p&gt;

&lt;p&gt;演算子には優先順位はなく、左からの順番に計算していくので、各構造の一番左の要素は配列であれば平坦化できます。それ以外は「vei …… ve'o」で囲み、各 sumti の末尾の「ve'o」と「ku'e」、それと「ve'o」直前の「ku'e」を消します：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/hv7y7defsmn561zgi4s6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/hv7y7defsmn561zgi4s6.png" alt="式" width="1655" height="613"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/fb32f937-6b97-4373-8d1b-7c6aec98ac7e" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/fb32f937-6b97-4373-8d1b-7c6aec98ac7e/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/fb32f937-6b97-4373-8d1b-7c6aec98ac7e" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;これでようやくなんとか出来上がりだと言えるでしょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  計算させよう
&lt;/h2&gt;

&lt;p&gt;最後に、数学ソフトを活用する面白い遊びをします。式を &lt;code&gt;Evaluate&lt;/code&gt; で囲むと、&lt;code&gt;HoldAll&lt;/code&gt; 属性や &lt;code&gt;Hold&lt;/code&gt; は無視され中身が評価されます。この原理を使って &lt;code&gt;kanji&lt;/code&gt;（ロジバンで「計算」）という関数を定義して、解答をロジバンで明らかしましょう：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://migdal.jp/uploads/articles/y5kqg0oorv2jbxmy4q25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://migdal.jp/uploads/articles/y5kqg0oorv2jbxmy4q25.png" alt="式" width="1441" height="478"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/9c204af8-5a8e-4b69-86f3-2acd306b35ec" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://www.wolframcloud.com/files/9c204af8-5a8e-4b69-86f3-2acd306b35ec/icon/FileBrowser" height="85" class="m-0" width="85"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.wolframcloud.com/obj/9c204af8-5a8e-4b69-86f3-2acd306b35ec" rel="noopener noreferrer" class="c-link"&gt;
          
        
                Wolfram Cloud Document
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Shared from Wolfram Cloud
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://www.wolframcloud.com/images/favicons/spikey-favicon.ico" width="96" height="96"&gt;
        wolframcloud.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  終わりに
&lt;/h2&gt;

&lt;p&gt;如何だったでしょうか。年末の忙しい時期にこれほど時間を費やしてしまったのは正解かどうか分かりませんが、今回を通じてロジバンと Mathematica についてたくさん学んだことは間違いないでしょう。&lt;/p&gt;

&lt;p&gt;「語学・言語学・言語創作」の趣旨から離れてしまったと思うので、申し訳なく思いますし、これはちゃんとした記事かどうかすら疑わしいところです。アドカレに参加している皆さんとこの記事を拝見している皆さんはすごい方ばかりで、私はこれくらい拙い文章しか書けない気もします。&lt;/p&gt;

&lt;p&gt;続編は、十進法以外の数、指数表記、複素数の扱いや、微積、線型代数、集合論、命題論理、述語論理などの分野に使われる記号と表現を順次対応していきたいと思います。今後さらに余裕ができたら、これとは逆のパーサー（ロジバンで書かれた数式を Wolfram 言語や 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;LaTeX\LaTeX&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textrm"&gt;L&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord textrm mtight sizing reset-size6 size3"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textrm"&gt;T&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord textrm"&gt;E&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord textrm"&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 などの形式に変換する解析器）ももしかしたら作りますのでお楽しみください！&lt;/p&gt;

&lt;p&gt;一読してくださった皆さんに感謝の意を申し上げます。&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Q&amp;amp;A: なぜラベルの &lt;code&gt;In[…]:=&lt;/code&gt; と &lt;code&gt;Out[…]=&lt;/code&gt; は水色じゃなく緑色なの？
&lt;/h3&gt;

&lt;p&gt;思うままに変えました。UI のテーマファイルを弄ったわけではありません。実は以上の写真と文書はどうやって作成したかというと、&lt;code&gt;Notebook&lt;/code&gt; 関数で &lt;code&gt;.nb&lt;/code&gt; ファイルの中身と同じように作ったノートブックをそれぞれ &lt;code&gt;Export&lt;/code&gt; と &lt;code&gt;CloudDeploy&lt;/code&gt; で出力／アップデートしています。自分で作っている上、色々カスタマイズできますので、関数の翻訳ラベルをオフし、セルのラベルを緑色に変えました。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Migdal は元々ヘブライ語で「塔」という意味らしいですが、これとは無関係の言葉遊びとして捉えていただければと思います。 ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;Wolfram 言語のみでアプリケーションを作ることも普通にできます。実際、Mathematica の中身の大部分は Wolfram 言語で書かれています。 ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Wolfram_Language#Pattern_matching"&gt;https://en.wikipedia.org/wiki/Wolfram_Language#Pattern_matching&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;&lt;code&gt;exp // f&lt;/code&gt; と &lt;code&gt;f[exp]&lt;/code&gt; と &lt;code&gt;f@exp&lt;/code&gt; の違いはありませんので &lt;code&gt;…… // Hold // FullForm&lt;/code&gt; は &lt;code&gt;FullForm[Hold[……]]&lt;/code&gt; に等しいです。 ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;今回は ASCII のアルファベットと数字のみ扱うとします。 ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn6"&gt;
&lt;p&gt;&lt;a href="https://reference.wolfram.com/language/tutorial/Expressions.html"&gt;https://reference.wolfram.com/language/tutorial/Expressions.html&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn7"&gt;
&lt;p&gt;&lt;code&gt;f @@@ exp&lt;/code&gt; の完全形は &lt;code&gt;Apply[f, exp, {1}]&lt;/code&gt; です。バージョン 13.1 以上では &lt;code&gt;MapApply[f, exp]&lt;/code&gt; と書くこともできます。 ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>人工言語</category>
      <category>技術</category>
      <category>数学</category>
      <category>ロジバン</category>
    </item>
  </channel>
</rss>
