日本語プログラミング言語「なでしこ」で遊ぼう
Ver.0.005 2015. 1.31
更新履歴
Ver.0.001    2014.11.30     新規作成
Ver.0.002    2014.12.06     記事追加
Ver.0.003    2014.12.13     記事追加 
Ver.0.004    2015. 1.11     記事追加
Ver.0.005    2015. 1.31     記事追加
  1. 第1章 なでしこで遊ぶ。
    1. 第1節 計算
      1. 1.LM317の定電流回路
      2. 2.LM317の定電圧電源
      3. 3.分圧回路
      4. 4.カウンタ
    2. 第2節表計算
      1. 1.Libre OfficeのCALCを使う
  2. 第2章 「なでしこ」を開発環境に使う。
    1. 第1節 プログラミングとは
    2. 第2節 なでしこは日本語が分かる?
      1. 1.ためしに
      2. 2.桃太郎を理解させる
      3. 3.日本語理解と方法(掲示板より)
      4. 4.辞書の定義
  3. 第3章 「なでしこ」暗号
    1. 第1節 はじめに(掲示板より)

はじめに


「なでしこ」は、面白い。もう、かなり前から(10年?)あるそうだ。
全部日本語でプログラムを書くので、プログラムは、Webに埋め込めます。
ですから、Webからコピーして、「なでしこ」に貼り付けて実行すればいいのです。

第1章 なでしこで遊ぶ。

第1節 計算

1.LM317の定電流回路


図1-1-1-1 LM317定電流回路

LM317の定電流回路はこのように構成されます。
OUT端子とADJ端子間は1.25Vで固定ですから、定電流値は1.25Vを設定抵抗値で割ったものになります。
ということで、どうあがいても入力電圧は1.25V以上必要なことは、見当がつきますね。
電流によって、最低電圧は変わります。1Aで約2Vです。
データシートのドロップ電圧で調べてください。

そこで、
=====プログラム======
#LM317定電流設計
「定電流は何mAですか。」と尋ねる。
定電流値はそれ。
設定抵抗=1250÷定電流値
「すると抵抗値は{設定抵抗を3で小数点四捨五入}Ωです。」と言う。
おわり。
================
で、計算されます。
コメント:
1.「定電流は何mAですか。」と尋ねる。
  定電流値はそれ。
 ここで、たずねた値は、「それ」に入ります。
2.{設定抵抗を3で小数点四捨五入}の「を3で小数点四捨五入」は小数点3桁で四捨五入ということです。

2.LM317の定電圧電源



図1-1-2-1 LM317定電圧電源回路

OUT端子とADJ端子間は1.25Vなので、出力電圧を抵抗、設定1と設定2で分圧して設定1の抵抗の電圧が1.25Vになるようにすれば言い訳です。
入力電圧のリップルの底と出力電圧の差は、先ほどのように、ドロップ電圧が必要になりますので、
入力電圧は出力電圧+ドロップ電圧以上必要です。ドロップ電圧は1Aで約2V、1.5Aで2.5Vくらいです。

======プログラム======
#LM317定電圧設計
「出力電圧は何Vですか。」と尋ねる。
出力電圧値はそれ。
「抵抗の設定1は何KΩですか。」と尋ねる。
設定1はそれ。
#          設定1
#1.25V=-----------------×出力電圧
#     設定1+設定2

#1.25×(設定1+設定2)=設定1×出力電圧
#設定1+設定2=設定1×出力電圧÷1.25
#設定2=設定1×出力電圧÷1.25ー設定1
#設定2=設定1×(出力電圧÷1.25ー1)
#より、
設定2=設定1×(出力電圧値÷1.25-1)
「すると抵抗値は{設定2を3で小数点四捨五入}KΩです。」と言う。
おわり。
=================
出力電圧12Vで設定1=1.2KΩで設定2=10.32KΩとなりました。
負荷電流1Aなら、ドロップ電圧2Vですから、入力電圧のリップルの底の電圧は14V以上必要ですね。
入力電圧が15Vで負荷電流1Aなら、3V分ICが負担しますから3V1A=3Wの発熱をしましね。
放熱に注意です。

3.分圧回路


図1-1-3-1 分圧回路

-3dB下げたいとかありますよね。で、この分圧回路になるわけですね。
入力インピーダンスは、単純に考えるとこの二つの抵抗の直列ですから足し算ですね。
E-12系列とE-24系列の抵抗値を選択できるように計算しました。
ちょっとプログラムが複雑です。

======プログラム=======
#分圧計算ーE-12,24系列
「何dB減衰させますか?」と尋ねる。
減衰量はそれ。
分圧比=10^((-減衰量)÷20)
「インピーダンスは何Ωですか?」と尋ねる。
インピはそれ。
#計算
出力抵抗=インピ×分圧比
入力抵抗=インピ-出力抵抗
#結果の表示
入力抵抗を2で小数点四捨五入で単位表示して、D文字列に代入。
出力抵抗を2で小数点四捨五入で単位表示して、Dd文字列に代入。
AIN=「入力抵抗は」
AOUT=「出力抵抗は」
AINにD文字列を追加してAINを言う。
AOUTにDd文字列を追加してAOUTを言う。
#桁移動
C=0
出力抵抗が10以上の間
 出力抵抗=出力抵抗÷10
 C=C+1
ここまで。
#桁移動
Cc=0
入力抵抗が10以上の間
 入力抵抗=入力抵抗÷10
 Cc=Cc+1
ここまで。
#E-12系列の抵抗値に変換
出力抵抗でE12系列してDに代入。
#桁移動を元に戻す
C回
 D=D
×10
ここまで。
#E-12系列の抵抗値に変換
入力抵抗でE12系列してDdに代入。
#桁移動を元に戻す
Cc回
 Dd=Dd
×10
ここまで。
#単位記号化
#デバッグ
Dで単位表示してD文字列に代入。
Ddで単位表示してDd文字列に代入。
AIN=「入力抵抗はE-12系列では」
AOUT=「出力抵抗はE-12系列では」
AINにDd文字列を追加してAINを言う。
AOUTにD文字列を追加してAOUTを言う。
減衰量=20×LOG10(D/(D+Dd))
「そのとき、減衰量は{減衰量を3で小数点四捨五入}dBです。」と言う。
#E-24系列の抵抗値に変換
出力抵抗でE24系列してDに代入。
#E-24系列の抵抗値に変換
入力抵抗でE24系列してDdに代入。
#桁移動を元に戻す
C回
 D=D
×10
ここまで。
#桁移動を元に戻す
Cc回
 Dd=Dd
×10
Dで単位表示してD文字列に代入。
Ddで単位表示してDd文字列に代入。
AIN=「入力抵抗はE-24系列では」
AOUT=「出力抵抗はE-24系列では」
AINにDd文字列を追加してAINを言う。
AOUTにD文字列を追加してAOUTを言う。
減衰量=20×LOG10(D/(D+Dd))
「そのとき、減衰量は{減衰量を3で小数点四捨五入}dBです。」と言う。
おわり。
#関数
●E12系列(Wで)
 #E12系列を探す。
 もしWが8.2×1.1未満ならWD=8.2 
 違えば、 
 もしWが6.8×1.1未満ならWD=6.8
 違えば、 
 もしWが5.6×1.1未満ならWD=5.6
 違えば、 
 もしWが4.7×1.1未満ならWD=4.7
 違えば、 
 もしWが3.9×1.1未満ならWD=3.9
 違えば、 
 もしWが3.3×1.1未満ならWD=3.3
 違えば、 
 もしWが2.7×1.1未満ならWD=2.7
 違えば、 
 もしWが2.2×1.1未満ならWD=2.2
 違えば、 
 もしWが1.8×1.1未満ならWD=1.8
 違えば、 
 もしWが1.5×1.1未満ならWD=1.5
 違えば、 
 もしWが1.2×1.1未満ならWD=1.2
 違えば、 
 もしWが1.0×1.1未満ならWD=1.0
 違えば、
  J=J 
 それ=WD。
#関数
●E24系列(WAで)
#E24系列を探す。
 もしWAが9.1×1.05未満ならDD=9.1
 違えば、
 もしWAが8.2×1.05未満ならDD=8.2
 違えば、
 もしWAが7.5×1.05未満ならDD=7.5
 違えば、
 もしWAが6.8×1.05未満ならDD=6.8
 違えば、
 もしWAが6.2×1.05未満ならDD=6.2
 違えば、
 もしWAが5.6×1.05未満ならDD=5.6
 違えば、
 もしWAが5.1×1.05未満ならDD=5.1
 違えば、
 もしWAが4.7×1.05未満ならDD=4.7
 違えば、
 もしWAが4.3×1.05未満ならDD=4.3
 違えば、
 もしWAが3.9×1.05未満ならDD=3.9
 違えば、
 もしWAが3.6×1.05未満ならDD=3.6
 違えば、
 もしWAが3.3×1.05未満ならDD=3.3
 違えば、
 もしWAが3.0×1.05未満ならDD=3.0
 違えば、
 もしWAが2.7×1.05未満ならDD=2.7
 違えば、
 もしWAが2.4×1.05未満ならDD=2.4
 違えば、
 もしWAが2.2×1.05未満ならDD=2.2
 違えば、
 もしWAが2.0×1.05未満ならDD=2.0
 違えば、
 もしWAが1.8×1.05未満ならDD=1.8
 違えば、
 もしWAが1.6×1.05未満ならDD=1.6
 違えば、
 もしWAが1.5×1.05未満ならDD=1.5
 違えば、
 もしWAが1.3×1.05未満ならDD=1.3
 違えば、
 もしWAが1.2×1.05未満ならDD=1.2
 違えば、
 もしWAが1.1×1.05未満ならDD=1.1
 違えば、
 もしWAが1.0×1.05未満ならDD=1.0
 違えば、
  K=K
 それ=DD
#関数
●単位表示(WDdで)
 もしWDdが1000000000未満なら、
  「{WDd÷1000000}MΩです。」をDDd文字列に代入。
 違えば、 
 もしWDdが1000000未満なら、
  「{WDd÷1000}KΩです。」をDDd文字列に代入。
 違えば、
 もしWDdが1000未満なら、
  「{WDd}Ωです。」をDDd文字列に代入。
 違えば、
  K=k
 それ=DDd文字列。
================
コメント:
1.関数の本文は字下げしなければなりません。
2.関数の戻り値は「それ」に代入されす。
 違えば、
  K=k
 それ=DDd文字列。
 この場合、おかしな表現になっていますが、  
   DDd文字列で戻る。
 と、してもいいです。

4.カウンタ

カウンタのシミュレーションです。
アップカウンタとダウンカウンタの動作をシミュレーションしています。
オブジェクト指向のプログラミングですね。
オブジェクが動作の定義を持っています。

■カウンタとは
 ・値
 ・データ端子
 ・ホールドする
 ・クリアする〜値=0
 ・ロードする〜データ端子を値に代入。

は、共通機能です。

■アップカウンタとは +カウンタ
 ・カウントする〜値=値+1

■ダウンカウンタとは +カウンタ
 ・カウントする〜値=値-1

は、アップカウンタとダウンカウンタの相違点です。
「カウントする」とプログラムで書いてもアップカウンタは増えるし、ダウンカウンタ
では、減ります。
======プログラム==========
#カウンタ
■カウンタとは
 ・値
 ・データ端子
 ・ホールドする
 ・クリアする〜値=0
 ・ロードする〜データ端子を値に代入。

■アップカウンタとは +カウンタ
 ・カウントする〜値=値+1

■ダウンカウンタとは +カウンタ
 ・カウントする〜値=値-1

#開始
「カウンタをシミュレーションします。アップカウンタとダウンカウンタが選べます」という。
「ダウンカウンタですか」で二択
 もし、はいなら、
  回路とはダウンカウンタ
 違えば
  回路とはアップカウンタ
#動作
回路のデータ端子は20
「データ端子は{回路のデータ端子}」をいう。
回路の値=35
「現在値は{回路の値}」をいう。
回路をクリアする。「クリア」という。
「現在値は{回路の値}」をいう。
回路がロードする。「ロード」という。
「現在値は{回路の値}」をいう。
回路がカウントする。「カウント」という。
「現在値は{回路の値}」をいう。
回路がカウントする。「カウント」という。
「現在値は{回路の値}」をいう。
回路がカウントする。「カウント」という。
「現在値は{回路の値}」をいう。
回路がカウントする。「カウント」という。
「現在値は{回路の値}」をいう。
回路がホールドする。「ホールド」という。
「現在値は{回路の値}」をいう。
================


第2節表計算

1.Libre OfficeのCALCを使う

======プログラム=====
CALC起動
CALC新規ブック。
「なでしこ」をA1にCALCセル設定。
「日本語」をA2にCALCセル設定。
「プログラミング」をA3にCALCセル設定。
「言語」をA4にCALCセル設定。

===============
すると、


となります。ここで、A1などと絶対座標で表しているから、マクロは分かりにくいのです。

そこで、A1という座標に名前を付ければいいのです。これをラベルを付けるといいます。
======プログラム=====
CALC起動
CALC新規ブック。
名前上セル =「A1」
名前上中セル=「A2」
名前下中セル=「A3」
名前下セル =「A4」
コピー先セル=「B5」
「なでしこ」を名前上セルにセル代入。
「日本語」を名前上中セルにセル代入。
「プログラミング」を名前下中セルにセル代入。
「言語」を名前下セルにセル代入。
 名前上中セルからセル値をコピー先セルにセル代入。
「{デスクトップ}sample.xls」へCALC保存。
終わり。
#補助関数
●セル代入(セル値を,セルに)
 セル値をセルにCALCセル設定。
#補助関数
●セル値(指定セルから)
 指定セルのCALCセル取得。
 それで戻る。

===============
ここでは、CALCセル設定命令をセル代入とし、CALCセル取得をセル値と言い換えています。
また、A1という絶対座標は
名前上セルというラベルに変わっています。
ですから、間違いはなくなるでしょう。

第2章 「なでしこ」を開発環境に使う。

第1節 プログラミングとは

なでしこを開発環境に使うというと、IDEとかRADとおもいますよね。
まあ、ある意味そうなんですが、なでしこは曲がりなりにも日本語がわかります。
ですから、日本語で、こうしてくれというと、辞書を片手に、日本語で書き下してくれます。
それをチェックして、問題なければ、さらに詳細辞書を片手に、日本語で書き下してくれ、
これを繰り返すと、最終的にC言語とか、C++とか、Javaに翻訳できますよね。

もちろん、HDLに書き下せはハードウエアになるわけですよね。

ここで、プログラムとは、「要求仕様をプログラミング言語で説明すること」と定義します。

すると、あなたは、要求仕様書を作るとそれをあなたがなでしこの言語で説明することになりますね。
でも、なでしこの言語で説明することはほぼ日本語ですから、日本語を日本語で説明することが
プログラミングだということになりますね。

そうか、そういうことなんですね。

第2節 なでしこは日本語が分かる?

1.ためしに

では、

菊が咲いたころ、斉藤のうわさを聞いた。
ひまわりが咲いて、田中の結婚を聞いた。
桜が咲いて、鈴木の合格を聞く。

この文を理解させましょう。

=====プログラム======
#文の評価
菊が咲いたころ、斉藤のうわさを聞いた。
ひまわりが咲いて、田中の結婚を聞いた。
桜が咲いて、鈴木の合格を聞く。
#関数
●咲い(花が)
 もし花が「桜」なら
  「{花}は春の花ですね。」という。
  抜ける。
 違えば、
 もし、花が「ひまわり」なら、
  「{花}は夏の花ですね。」という。
  抜ける。
 違えば、
 もし、花が「菊」なら、
  「{花}は秋の花ですね。」という。
  抜ける。
 違えば、
 「{花}は花ですね。」という。
 k=k
#関数
●聞く(事件を、誰かの)
 「誰の{事件}ですか?」と尋ねる。
 その人はそれ。
 もし事件が慶事なら、
  「{その人}さん、おめでとうございます。」という。
 違えば、
  「そうですか、{その人}さんですか」という。
#関数
●慶事(事件が)
 もし事件が、「合格」なら真で戻る。
 違えば、
 もし事件が、「結婚」なら真で戻る。
 違えば、
  偽で戻る。

=====終わり========
プログラムをコピーして、なでしこに貼って、実行させるとあなたと会話してくれます。

2.桃太郎を理解させる

では、ためしに、桃太郎の冒頭部分を解析させましょう。

=====プログラム======
#桃太郎
#解析用変数
登場人物1=文字列
登場人物2=文字列
日時=文字列
場所=文字列
事件=文字列
#物語
むかし、むかし、ある所に、おじいさんとおばあさんが、住んでいました。
ある日、おじいさんが山へ芝刈りに行き、おばあさんが川へ洗濯に行きました。

おばあさんが、洗濯をしていると、川上から、おおきな桃が、
どんぶらこっこと、どんぶらこっこと流れてきました。
#解析結果
「以上を解析した結果」と表示。
「いつかというと{日時}」と表示。
「登場人物は{登場人物1}と{登場人物2}」と表示。
「おきた事件は{事件}」と表示。
#関数
●住(人1と人2が、どこに)
 「{人1}と{人2}が{どこに}住んでいたんだよね。 」という。
  登場人物1=人1
  登場人物2=人2
  場所=どこに
●むかし
 「ずーと前のことだね」という。
●ある日
 「何か起きた特別の日なんだよね。」という。
  日時=「ある日」
●行(誰が、何処へ、仕事に)
 「{誰}が{仕事}をしに{何処}に行ったんだよね」という。
●している(誰が、何を)
 「{誰}が{何}をしていたんだよね」という。

●流れる(何処から、何が、文1と、文2と)
 「そのとき{何処}から、{何}が流れてきたんだよね」という。
 「{文1}と、{文2}と音がしたんだよね」という。
  事件=「{何処}から」
  事件に「{何}が流れてきた」を追加する。
=====終わり========

このように、単語の理解で、出来事をピックアップしてゆけば、全体像をつかめますね。

以下は、物語をすべて、プログラムとしました。後は、単語の理解で、物のピックアップ変数に代入してやれば、
解析できますね。

=====プログラム======
#桃太郎物語
むかし、むかし、ある所に、おじいさんとおばあさんが、住んでいました。
ある日、おじいさんが山へ芝刈りに行き、おばあさんが川へ洗濯に行きました。
おばあさんが、川で、洗濯をしていると、川上から、おおきな桃が、
どんぶらこっこと、どんぶらこっこと流れてきました。
そこで、おばあさんが、おおきな桃を家へ持ち帰りました。
おじいさんとおばあさんが、おおきな桃を割りました。
なんとあら不思議、赤ん坊が桃の中から生まれました。
それで、桃太郎と名付けられました。
やがて、桃太郎が立派な若者になりました。
当時、悪い鬼が都で乱暴を働き、皆が、困っていました。
そこで、桃太郎が、「よし、私が、悪い鬼を退治しよう」と決心しました。
それで、おじさんとおばあさんが桃太郎にきびだんごを作りました。

桃太郎が、道を進むと、
犬が、「桃太郎さん、腰に付けているものは、何ですか」と聞きました。
桃太郎が「きびだんごだよ、ひとつあげるから家来になってくれ」と犬に頼みました。
しばらく、桃太郎が、道を進むと、
猿が、「桃太郎さん、腰に付けているものは、何ですか」と聞きました。
桃太郎が「きびだんごだよ、ひとつあげるから家来になってくれ」と猿に頼みました。
しばらく、桃太郎が、道を進むと、
雉が、「桃太郎さん、腰に付けているものは、何ですか」と聞きました。
桃太郎が「きびだんごだよ、ひとつあげるから家来になってくれ」と雉に頼みました。

そこで、桃太郎と犬と猿と雉が、鬼ヶ島に船で向かいました。
ようやく、船が鬼ヶ島に着きました。
桃太郎と犬と猿と雉が、鬼ヶ島に降りました。
鬼達が桃太郎達を見つけました。
「お前達は、なにしにここに、着たんだ」と鬼達が叫びました。
「お前達を成敗しに着たんだ」と、桃太郎が叫びました。
すぐさま、桃太郎が鬼達に飛びかかりました。
犬が、鬼に噛み付き、猿が鬼を引っ掻き、雉が鬼を突っつきました。
桃太郎達が鬼ヶ島で大暴れしました。
それで、「もう勘弁してくれ」と鬼頭が叫びました。
桃太郎達が鬼ヶ島からたくさんの宝物と共に帰ってきました。
それで、おじさんとおばあさんと幸せに暮らしました。
#関数
●帰る(誰が、何処から、AのBと共に)
 「{誰}が、{何処}から{A}の{B}を持って帰ったんだよね」という。
●暮らす(人1と人2と、Aに)
 「{人1}と{人2}とみんな{A}に暮らしたんだね」という。
●住(人1と人2が、どこに)
 「{人1}と{人2}が{どこに}住んでいたんだよね。 」という。
●むかし
 「ずーと前のことだね」という。
●ある日
 「何か起きた特別の日なんだよね。」という。
●行(誰が、何処へ、仕事に)
 「{誰}が{仕事}をしに{何処}に行ったんだよね」という。
●している(誰が、何処で、何を)
 「{誰}が{何処}で{何}をしていたんだよね」という。
●流れる(何処から、何が、文1と、文2と)
 「そのとき{何処}から、{何}が流れてきたんだよね」という。
 「{文1}と、{文2}と音がしたんだよね」という。
●すぐさま
●そこ
 「というわけでということだね」という。
●それ
 「というわけでということだね」という。
●持ち帰り(誰が、何を、どこへ)
 「{誰}が、{何}を{どこ}にもっていったんだよね」という。
●割る(人1と人2が、何を)
 「{人1}と{人2}は、{何}を包丁で切って、2つに割ったんだよね」という。
●なんとあら不思議
 「とするとふしぎにもということだよね」という。
●生まれる(何が、何処の中から)
 「{何処}の中から{何}がでてきたんだよね」という。
●名付け(Aと)
 「{A}というなまえにしたんだよね」という。
●やがて
 「何年かしてということだよね」という。
●なりました(Aが、Bに)
 「{A}は{B}になったんだよね」という。
●当時
 「その時期なんだよね」という。
●働く(人が、何処で、何を)
 「{人}が{都}で{乱暴}をしていたんだよね」という。
●困る(人が)
 「それで{人}が困っていたんだよね」という。
#●という訳 
# 「そういうわけでということだよね」という。
●決心する(誰が、文と)
 「だから{誰}が『{文}』と決心したんだよね」という。
●聞く(誰が、文と)
 「{誰}が『{文}』を聞いたんだよね」という。
●作る(人1と人2が、誰に、何を)
 「{人1}と{人2}は、{誰}に{何}を作ってやったんだよね」という。
●進む(誰が、何を)
 「{誰}は、{何}を歩いていたんだよね」という。
●頼む(誰1が、文と、誰2に)
 「{誰1}が『{文}』と{誰2}にお願いしたんだね」という。
●しばらく
 「また、少し行くとということだね」という。
●向かう(AとBとCとDが、Eに、Fで)
 「{A}と{B}と{C}と{D}は{E}に{F}で行ったんだよね」という。
●ようやく
 「とうとうということだね」という。
●着く(何が、何処に)
 「{何}が{何処}に着いたんだよね」という。
●降りる(AとBとCとDが、Eに)
 「{A}と{B}と{C}と{D}は{E}に降りたんだよね」という。
●見つける(誰が、何を)
 「{誰}が{何}を見つけたんだね」という。
●叫ぶ(文と、誰が)
 「{誰}が『{文}』と叫んだんだね」という。
●飛びかかる(誰が、何に)
 「{誰}が{何}に飛びかかったんだよね」という。
●たくさん
●走ってくる(誰が)
 「{誰}がきたんだね」という。
●噛み付く(誰が、何に)
 「{誰}が{何}に噛み付いたんだよね」という。
●引っ掻く(誰が、何を)
 「{誰}が{何}を引っ掻いたんだよね」という。
●突っつく(誰が、何を)
 「{誰}が{何}をつっついたんだよね」という。
●やっつける(誰が、何に)
 「{誰}が{何}にやっつけられたんだよね」という。
●大暴れ(誰が、何処で)
 「{誰}が{何処}で大暴れしたんだね」という。
=====終わり========

3.日本語理解と方法(掲示板より)

 =====プログラム====
「二乗する数はいくつですか」と尋ねる。
数はそれ。
二乗(数)を言う。
おわる
●二乗(A)
  A*Aを戻す。
==========

=====プログラム====
「二乗する数はいくつですか」と尋ねる。
数はそれ。
数の二乗を言う。
おわる
●二乗(Aの)
  A*Aを戻す。
==========
とでは、後のほうが日本語らしいでしょう?

=====プログラム====
#消費税
商品価格=5000円
販売価格=5400円
消費税分=400円
消費税=8
#質問
「商品価格はいくらですか」と尋ねる。
商品価格はそれ。
「消費税は何%ですか」と尋ねる。
消費税はそれ。
#定義
商品価格から税率計算したものが消費税分。
商品価格に消費税分を上乗せしたものが販売価格。
したがって、「商品価格が{商品価格}円であれば、消費税が{消費税}%なら販売価格は{販売価格}円である。」という。
おわる。
#関数
●したがって
●税率計算(Aから)
 消費税分はAに(消費税÷100)を掛ける。
●上乗せ(AにBを)
 販売価格はAにBを足す。
==========

#定義以下の
商品価格から税率計算したものが消費税分。
商品価格に消費税分を上乗せしたものが販売価格。

は、日本語の文らしいでしょう?

日本語らしさをなるべく残すべきなんだと思う。

 「関数」と言わずに、「言葉の説明」と言えば、必然的に日本語らしくなるんだと思う。

数の二乗を言う。
●二乗(Aの)
  A*Aを戻す。

は、二乗という言葉を説明しているとおもえば、わかりやすい。

それに対して、
二乗(数)を言う。
おわる
●二乗(A)
  A*Aを戻す。

は、関数という見方なんだけど、日本語として不自然になるよね。

関数は、もともと説明のためにあるわけだから、関数という形式じゃなく、日本語として、言葉の説明らしくすべきなんだな。

====プログラム======
#円の面積。
#質問
「円の半径はいくつですか」と尋ねる。
半径はそれ。
#定義
円の面積=半径の二乗×円周率
円の面積を言う。
おわる。
●面積(Aの)
●二乗(rの)
 r×rを戻す。
●円周率
 PIを戻す。
================
これは、数学的な表現ですよね。

でも、以下のようにしたら、日本語らしいでしょ?
====プログラム======
#円の面積。
#質問
「円の半径はいくつですか」と尋ねる。
半径はそれ。
#定義
円の面積は、半径の二乗に円周率を掛ける。それを言う。
おわる。
●面積(Aの)
●二乗(rの)
 r×rを戻す。
●円周率
 PIを戻す。

================

まあ、無理をすることはないのですけれども...

#定義
円の面積は、半径の二乗に円周率を掛ける。それを言う。

これは、おかしな表現ですよね。

円の面積は、半径の二乗に円周率を掛けたものを言う。

と書きたかったのですが、「なでしこ」の文法のエラーに引っかかるので....

●面積(Aの)

これも「円の面積」とすると「なでしこ」の文法が「の」で単語を分割してエラーになるので....

まあ、苦肉の策です

そういう仕掛けがあるわけです。

●面積(Aの)
●二乗(rの)
 r×rを戻す。
●円周率
 PIを戻す。

これだと、「●面積(Aの)」は何もしないわけで、つまり「円の面積は」を読み飛ばすための苦肉の仕掛けでして.....

 円の面積は、半径の二乗に円周率を掛ける。それを言う。

ここで、述語がどうすべきかを決めているわけで、主語は、特に意味がないラベルなんだな。

桃太郎物語でもあったように、述語で解析するんだな。

だから、述語から解析するので、日本語では、主語が抜けるんだと思うな。

意味のわからない言葉は、ラベルなんだな。

円の面積は、ラベルで意味のわからないものなんだ。

二乗もラベルで意味のわからないものなんだ。

で、あとの述語から、何と何からどうしてなっているかをわかるわけだ。

国語では、主語から、説明するけど、主語から、文は理解されないんだな。

述語から、文は理解されるんだな。

主語は、スタックに最初にプッシュされて、最後にポップされるんだな。

円の面積は、半径の二乗に円周率を掛けたものをいう。

だから、解析では主語は一旦無視されて、

半径の二乗に円周率を掛ける。それを円の面積という。

と解釈されるんだな。
     
====プログラム======
#円の面積。
#質問
「円の半径はいくつですか」と尋ねる。
半径はそれ。
#円の面積の定義
半径の二乗に円周率を掛ける。それを言う。
おわる。
●面積(Aの)
●二乗(rの)
 r×rを戻す。
●円周率
 PIを戻す。
================
こうすれば、意味としても、プログラムとしてもいいんじゃないかな。

述語からその前にあるべきものが決まって、文の構造解析が行われると思うな。

●住む(誰が、どこに)

というふうに、その文に必要な単語とその意味的分類と構造が決定される。

ここで、「誰が」は、「おじいさん」でも「おじいさんとおばあさん」でも「おじいさんとおばあさんと桃太郎」でもいいわけだし、「小さな子ども」というように形容詞がついてもよい。

「なでしこ」にこれらの機能を追加してやれば、仕様書から辞書を片手に書き下せるかな?

したがって、「誰が」にあたる解析辞書があって、「どこに」も同じく解析辞書があるわけだ。

4.辞書の定義

単語辞書は、
====プロゴラム
#単語辞書
単語辞書は「単語、分類、主語、他
住む、述語、誰が、何処に
行く、述語、誰が、何処へ
使う、述語、誰が、何を
買う、述語、誰が、何を
それ、予約語、一次変数、なし
言う、予約語、誰が、文を
尋ねる、予約語、誰が、何を
おおきい、形容詞、なし、物
小さい、形容詞、なし、物
美しい、形容詞、なし、物」

単語辞書グリッドとはグリッド
単語辞書グリッドのアイテムは、単語辞書。
======


こうすると、分類します。
=====プログラム====
#単語辞書
単語辞書は「単語、分類、主語、他
住む、述語、誰が、何処に
行く、述語、誰が、何処へ
使う、述語、誰が、何を
買う、述語、誰が、何を
それ、予約語、一次変数、なし
言う、予約語、誰が、文を
尋ねる、予約語、誰が、何を
おおきい、形容詞、なし、物
小さい、形容詞、なし、物
美しい、形容詞、なし、物」

予約語は、単語辞書の0から「予約語」を表ピックアップ。
予約語を表示。

述語は、単語辞書の0から「述語」を表ピックアップ。
述語を表示。

形容詞は、単語辞書の0から「形容詞」を表ピックアップ。
形容詞を表示。

=========


> 住む、述語、誰が、何処に
> 行く、述語、誰が、何処へ
の「に」「へ」も分類したほうがいいかもしれませんね。

述語辞書とか予約語辞書とか分けるといいでしょうね。

「誰が」は、BNF記法(バッカス・ナウア記法)で、書くと効率がいいかもしれませんね。

yaccとlexの応用として、電卓が有名ですね。      

BNF記法を「なでしこ」に導入するわけですよね。

誰:=人
 |誰 「と」 人  #この宣言は「人と人」あるいは「人と人と人と・・」というためです。
 ;
人:=名前
 |名前+「さん」
 |名前+「くん」
 |指示+「人」
 ;
指示:=あの
  |その
  |この
  ;
名前:=姓+名
  |姓
  |名
  ;
姓:=木村
  |田中
  |鈴木
  ;
名:=拓哉
  |達也
  |次郎
  ;

まあ、こんなふうに定義してゆくと

「木村さんとあの人と達也くん」
は、誰から人に行き、人から名前+さんに行き、名前から姓に行き・・・・


 人:=名前
 |名前+「さん」
 |名前+「くん」
 |指示+「人」
 |形容詞+「人」←追加
 ;
指示:=あの
  |その
  |この
  ;
形容詞:=

とすると、「大きな鈴木くん」とか「ちいさな人」とかもできる。

そうか、「小さな子ども」とかまだいっぱいあるなあ・・・・



第3章 「なでしこ」暗号

第1節 はじめに(掲示板より)

「なでしこ」で桃太郎物語をプログラムにしました。
言葉の解釈をする関数に仕掛けをしておくと桃太郎物語が暗号文になるわけでしょ。
ある手紙がある小説の抜き出しで、「なでしこ」の解読意味辞書で解読されるわけだ。
この手紙を受け取って他の人が解読するのは、できないでしょ?

暗号って、「ひらけ!ごま」じゃないですか。数字じゃないんだな。

日本語プログラミング言語「なでしこ」が従来の技術を超えた暗号理論を生み出す可能性があるという事ですよね。

ドイツの暗号機エニグマはイギリスの初期のコンピュータで解読されました。いまだに、詳細技術は国家機密なんだとか.....
ドイツの失敗は、標準化にあったわけですからね。
便利という事は、安全性を担保しないという見本みたいなもんですからね。

「なでしこ」暗号は、標準化をしない暗号なので、絶対安全になるはずなんだけどね....

そもそも、1文字がひとつの暗号に対応するという事が間違いなんだな。これは、ある意味標準化だ。
そこで、広辞苑でも、芥川の小説でもいい。何ページの何行目の何単語めとかにすると単語なんで、幾分マシになるだろう。

だから、「なでしこ」暗号は、単語単位なので、無理してハフマン符号にように、均一化することで、特徴を潰す必要がないんだ。言語固有の文字の偏りは全く意味をなさないわけだからね。

もちろん、同じ単語も違うページから探すけれどね。単語でなく、文全体かもしれない。

「なでしこ」暗号はそれに単語解析の推論が入るので、単語を見つけても推論法則がわからなければ、解読できない。

暗号室には本棚があって、それぞれの暗号室では、蔵書が違う。
まあ、ハードディスクの中の本棚だけれどね。

日本軍の乱数表がミッドウェイ海戦で沈んだ船の無線室から引き上げられて、....

だから、「なでしこ」暗号は、標準化が一切無いので、暗号室が破られても一切関係がない。

蔵書は新刊本が定期的に送られ、更新される。

もちろん新刊本は、日本からとは限らない。

単語解析推論辞書は何通りも用意されているものとする。

したがって、日本語だけとは、限らない。

俳句には季語がある。これも単語解析推論に使える。

また、あこぎというと辞書でくれば言葉の由来がある。これも単語解析推論に使える。

本棚に、ことわざ辞典、古語辞典、家庭の医学、国語辞典、....などもある。

したがって、単語解析推論は、解読は複雑であるけど、構成は易しい。

俳句は5,7,5とか短歌は、...、川柳は....という規則から、単語を推測してもよい。

英語なら、韻をふむとかね。

そういう暗黙の省略もあっていい。

ハフマン符号化は、度数分布を作って、一番頻度の高いものから最小のビット数を割り当て、次は更にビットを増やして区別するので、全体として、度数分布が激しければ、大きく圧縮できます。

これをバイト単位で見れば、乱数列になるので、均質化されます。つまり、度数分布がなくなるわけです。

辞書式符号化は、単語単位とも言えます。ハフマン符号化は文字単位なので、辞書式のほうが圧縮率が高いので、一般にこれが使われます。

 でも、1億個の素数表を圧縮させても、0-9の文字とTABとCR,LFしかないのでほとんど圧縮できません。

ハフマン符号化でも、辞書式でも無理です。

つまり、これらは、偏りに頼っているからです。

「なでしこ」暗号は偏りとは無縁です。
     
偏りに頼っているのもは、それを使っているので、当然出力に偏りがありませんので、これ以上圧縮はできません。

ですから、ファイルサイズが小さいものはほとんど無理です。

したがって、暗号という観点から見れば、短い文は、符号化ができないとも言えます。

故に、長文であればあるほどいい訳で、たとえば、伝えたい要件の肯定、否定などたくさんの場合の文を添付すれば、どれが本当に伝えたい文なのかは、もし仮に解読できたとしてもわかりませんね。

以前北朝鮮でキムジョンイルをたたえる漢詩が、掲示板だったかに掲載されました。当局は最初は気づきませんでしたので、しばらく掲示されていました。
でも、一番上の文字を左から読むと.....

という事件がありました。

長文のいくつかの文を並べても、斜めに肯定否定を選ぶとかいうような、魔方陣解があるわけです。


つづく。