descartes-src (ソースパッケージ descartes-src-0.26.0.tar.gz) | 2012-09-09 20:57 |
descartes-win (Windows用バイナリパッケージ descartes-win-0.26.0.zip) | 2012-09-09 20:52 |
会話キャラクター: ツンデレ アプリケーション (会話キャラ:ツンデレ v1.0 for Windows) | 2010-04-29 13:41 |
会話キャラクター: 2人の女の子 ダブルキャラクター (会話キャラクター 2人の女の子 ダブルキャラクター 1.0 for Windows) | 2011-10-02 22:23 |
会話キャラクター: Eliza風英語版 (会話キャラ:Eliza風英語版 v1.0 for Windows) | 2010-05-11 01:06 |
会話キャラクター: 猫耳メイド アプリケーション (会話キャラ:猫耳メイド v1.0 for Windows) | 2010-04-27 21:15 |
会話キャラクター: イライザ風日本語版 (会話キャラ:イライザ風日本語版 v1.0 for Windows) | 2010-04-30 21:53 |
経済指標表示プログラム for Windows (経済指標表示プログラム V1.0) | 2011-08-18 22:04 |
ニュースヘッドライン表示プログラム (ニュースヘッドライン表示プログラム V1.0 for Windows) | 2011-08-16 12:31 |
デカルト言語 example (デカルト言語の例題 example-0.7.0.zip) | 2009-03-01 19:47 |
電力状況表示プログラム for Windows (2011年夏版 全国電力供給状況表示プログラム V1.0) | 2011-08-15 13:25 |
注) このプログラムは、デカルト言語のリリース0.22.0から動作します。
「めぐりあひて見しやそれとも分かぬまに 雲がくれにし夜半の月かな」 紫式部
「紫」は、日本語でプログラムの書ける新しい言語です。 並列ロジックプログラミング言語「デカルト言語」で作成し ました。
他にも日本語プログラミング言語は、いろいろと存在します。 しかし、従来の日本語プログラミング言語は、基本的には 手続き型のプログラミングモデルで動作するものが多いでしょう。 手続き型の処理では、順に上から下に実行され、受け付ける構文 は規定された範囲内で厳密に制限されます。
しかし、それらと「紫」には大きな違いがあります。 それは、「紫」は一階述語論理のプログラミングモデルを基に していることです。「紫」では、論理的な関係を日本語で記述する ことによって、プログラムを作成します。
作成されたプログラムは、「紫」により、一階述語論理の関係に 分解されてコンパイルされ実行されます。
まずは、紫のプログラムの雰囲気を伝えるために、簡単 なプログラム例を示しましょう。
-- ここからプログラム例 soc.mrs ----------- // 人間についての定義 #xが人間であれば、#xは言葉を使う。 #xは、言葉を使うならば、#xは論理的に思考する。 // ソクラテスについて ソクラテスは人間である。 // 質問 ソクラテスは、論理的に思考するか? -- ここまでプログラム ---------------------
以下に実行例を示しましょう。
$ descartes murasaki soc.mrs ソクラテスは、論理的に思考するか? ソクラテスは、論理的に思考です。
デカルト言語のパッケージの中の" example/murasaki/samples"の下に いくつか例題プログラムを入れてあるので試してみてください。
変数は、先頭に#の付いたワードである。
例) #x, #人間, #result
単文は、基本的な構文であり、一つの事実関係について記述する。
... は(or が) ... 述語 ... は(or が) ... を ... 述語 ... は(or が) ... と ... と ("と"は複数可) ... を(or が, を, の, に) ... 述語 ... を(or に, の) ... 述語
文末は、"する", "です", "だ", "である", "した", "します"のいずれか。 必ず文末の最後には"。"を置くこと。
プログラムを定義するための構文である。 一つの単文で構成された、一つの事実関係について述べた文である。 単文と文末の組み合わせで構成される。
単文 文末 。 例) #xは()と#xの、リスト追加です。 #x : 変数 は () : 空リスト と #x : 変数 の 、 リスト追加 : 述語 です : 文末 。
プログラムを定義するための構文である。 条件を示す単文と、その条件に合致したときに真と判定される単文の 組み合わせであり、次のような構文である。
単文 である場合 単文 文末 。
"である場合"は、"である場合", "であれば", "であるとき", "の場合", "のとき", "するならば"のいずれかでも可。
また、複数の条件を繋げた文も以下のように可能だ。
単文 であり ... 単文 であり 単文 である場合 単文 文末 。
「単文 であり」の部分は、複数存在しても良い。 "であり"は、"であるかつ", "であり", "でかつ", "するかつ", "かつ", "したかつ", "し", "で"のいずれかでも可。
例) #xが人間であれば、#xは言葉を使う。 #xは、言葉を使うかつ、#xは文字を使うかつ、#xは、社会を形成するならば、 #xは文化を持つ。
プログラムの起動に使われ、事実関係の確認を行う。
結果として回答が返される。
文の文末が、"ですか", "か", "であるか", "するか", "したか", "しますか"である。
最後の句読点は、"。"以外にも"?", "?"でも可。
例) ソクラテスは、論理的に思考するか? ネコは文化を持つか?
プログラムの起動に使われ、事実関係の確認を行う。 結果として該当するすべての回答が返される。
文の文末が、"であるすべて", "すべて" である。 最後の句読点は、"。"以外にも"?"でも可。
例) #xは書物を残すすべて?
疑問文とまったく同様に、プログラムの起動に使われ、事実関係の確認を行う。 結果として回答が返される。
文の文末が、"してください", "して下さい", "して", "しろ", "せよ"である。 最後の句読点は、"。"以外にも"?", "?"でも可。
例) ハローワールドを実行してください。
// から行末までが注釈(コメント)になる。
文の途中には注釈は書けないことに注意。
[数の計算] 数式 を 計算 する 。 数式は、変数 = 式の形態で、たとえば #x = 2 * 3 などである。 例) #x = 2 * 3 を計算する。
[数の比較] 比較式 を 比較 する。 比較式 が 成立 する。 上に示すように2種類の表現があります。 比較式は、大小関係を判定する式で、たとえば #x + 7 >= #y * 8 などである。 例) #x + 7 >= #y * 8 を比較する。 #x + 7 >= #y * 8 が成立する。
[表示] (リスト) を 表示 する。 改行 を 表示 する。 リストの中には、句読点"。"と ”、"は使えません。表示後に 改行します。 「改行を表示する。」は、改行だけを行います。 例) (結果 #x) を表示する。 改行を表示する。
エラーを起こした構文をエラーメッセージで表示します。 しかし、幅広い日本語の構文をできるだけ解釈しようとするため、思った動作をしなかったりエラー箇所がわかりにくくなることが多いです。
紫は、元の日本語プログラムをデカルト言語に変換してから実行しています。その変換後のプログラムは、カレント・ディレクトリの下にtmpfile.txtの名前で作成されるのでそれを参照するとエラーの原因解明に役立つことでしょう。
(デバッグと構文の解釈の精度向上あるいは多少の構文の誤りを自動補正するような工夫が今後の課題と思います。)
紫では、五種類の単文の日本語構文をデカルト言語の節に変換します。
五種類の単文の日本語構文をまず以下に示しましょう。
M1構文 : '主語' (は | が) { ~ と} '目的語' (が | を) '述語' 単文末 。 M2構文 : '主語' (は | が) { ~ と} '目的語' の '述語' 単文末 。 M3構文 : '主語' (は | が) { ~ と} '目的語' に '述語' 単文末 。 M4構文 : '主語' (は | が) '述語' 単文末 。 M5構文 : '目的語' (を|に|の) '述語' 単文末 。
それぞれの助詞の後には、適当に句点が入ってもよいです。
ここで、「~ と」となっているところは、複数の"と"で結ばれた構文です。
また、"単文末"となっているのは、次に示すような共通の構文です。
(であるすべて | すべて) ("。" | "?" | "?") または (ですか|か|であるか|するか|したか|しますか) ("。" | "?" | "?") または (してください | して下さい | して | しろ | せよ) "。" または (です|だ|である|する|した|します) "。" または "。"
単文の一階述語形式(ホーン節)への変換方法を以下に示します。
M1構文 : <M1 '述語' '主語' (~ ~ ... '目的語')> M2構文 : <M2 '述語' '主語' (~ ~ ... '目的語')> M3構文 : <M3 '述語' '主語' (~ ~ ... '目的語')> M4構文 : <M4 '述語' '主語' () > M5構文 : <M5 '述語' '目的語' () >
それぞれの構文から上に示すようなデカルト言語での節が生成されます。
『2.1 単文の五種類の日本語構文』の元の日本語構文と見比べてみてください。
単純な3つの引数を持つ節に変換されます。
<構文名 '述語' '名詞'または'目的語' (~ ~ ... '目的語')>
M4とM5構文では第3引数は存在しないので()で埋めています。
例を挙げてみましょう。
リンゴは、鳥と人を喜ばせます。 → <M1 喜ばせます リンゴ (鳥 人)> リンゴは、鳥と人の食べ物です。 → <M2 食べ物 リンゴ (鳥 人)> リンゴは、鳥と人に役立ちます。 → <M3 役立ちます リンゴ (鳥 人)> リンゴは赤いです。 → <M4 赤い リンゴ ()> リンゴを投げます。 → <M5 投げます リンゴ ()>
リンゴをオレンジにして、人を猿に変えてみるとこのようになります。
オレンジは、鳥と猿を喜ばせます。 → <M1 喜ばせます オレンジ (鳥 猿)> オレンジは、鳥と猿の食べ物です。 → <M2 食べ物 オレンジ (鳥 猿)> オレンジは、鳥と猿に役立ちます。 → <M3 役立ちます オレンジ (鳥 猿)> オレンジは橙です。 → <M4 橙 オレンジ ()> オレンジを投げます。 → <M5 投げます オレンジ ()>
このように、入力された日本語をデカルト言語の節に変換していきます。
複文は、単文を複数組み合わせた構文です。
次に示すような2種類の構文で表されます。
複文の構文1: "単文" (である場合 | であれば | であるとき | の場合 | のとき | するならば | ならば | するとき | したとき | する場合 | した場合) "単文" "単文末" "。"
この構文は、2つの単文を繋いだ複文を作るのに使います。
例えば、 「#xが人間であれば、#xは言葉を使う。」
この例では[#xが人間] [であれば]、[#xは言葉を使う]。と分解できます。
「#zは#xと#yのリスト追加のとき、(#a:#z)が(#a:#x)と#yのリスト追加です。」
この例では[#zは#xと#yのリスト追加] [のとき] 、[(#a:#z)が(#a:#x)と#yのリスト追加] [です] 。と分解できます。
複文の構文2: {"単文" (であるかつ | であり | でかつ | するかつ | かつ | したかつ | し | で)} "単文" (である場合 | であれば | であるとき | の場合 | のとき | するならば | ならば | するとき | したとき | する場合 | した場合) "単文" "単文末" "。"
構文2は、構文1の拡張であり、3以上の単文を結んだ複文を作るときに使います。
最初の単文の並びが{}大カッコで括られているのは繰り返しを意味していて、複数の同様の連なりを許すことを意味します。
例えば、 「#祖母は#親の母親で、#親は#孫の親のとき、#祖母は#孫の祖母です。」
この例では[#祖母は#親の母親] [で] 、[#親は#孫の親] [のとき]、[#祖母は#孫の祖母] [です] 。と分解できます。
#n1=#n-1を計算し、 #n2=#n-2を計算し、 #x1は、#n1のフィボナッチ数であり、 #x2は、#n2のフィボナッチ数であり、 #result=#x1+#x2を計算する場合、 #resultは#nのフィボナッチ数です。
この例では次のように分解できます。
[#n1=#n-1を計算] [し] 、 [#n2=#n-2を計算] [し] 、 [#x1は、#n1のフィボナッチ数] [であり] 、 [#x2は、#n2のフィボナッチ数] [であり] 、 [#result=#x1+#x2を計算] [する場合] 、 [#resultは#nのフィボナッチ数] [です]。
この例では、6つの単文を連結した複文となっています。
日本語プログラミング言語「紫」では、改行も空白も構文の解釈に影響しないので上のように複数行であっても問題ありません。
複文のデカルト言語のプログラム形式である一階述語形式(ホーン節)への変換方法を以下に示します。
まず複文の構文1についてです。
複文の構文1: "単文1" (である場合 | であれば | であるとき | の場合 | のとき | するならば | ならば | するとき | したとき | する場合 | した場合) "最後の単文" "単文末" "。" ↓変換 "最後の単文" "単文1" ;
複文の構文1では、"単文1"と"最後の単文"の2つの単文を含みます。それを、"最後の単文"を先頭にして、その条件として"単文1"を後に置きます。
例えば以下の例を見てください。
風が吹くならば、土ぼこりが立つ。 ↓変換 <M4 立つ 土ぼこり ()> <M4 吹く 風 ()> ;
「風が吹く」の"単文1"は、前の項で説明したように<M4 吹く 風 ()> と変換されます。
「土ぼこりが立つ」の"最後の単文"は、<M4 立つ 土ぼこり ()> と変換されます。
その二つの単文で"最後の単文", "単文1"の順番に並べ替えることによって、"単文1"ならば"最後の単文"という意味を表します。
prologで言えば、以下のようなプログラムと同等です。
M4(立つ 土ぼこり []) :- M4(吹く 風 []).
次に複文の構文2についてです。
複文の構文2: {"単文1~n-1" (であるかつ | であり | でかつ | するかつ | かつ | したかつ | し | で)} "単文n" (である場合 | であれば | であるとき | の場合 | のとき | するならば | ならば | するとき | したとき | する場合 | した場合) "最後の単文" "単文末" "。" ↓変換 "最後の単文" "単文1" "単文2" ... "単文n";
複文の構文2では、"単文1"から"単文n"と"最後の単文"のn+1の単文を含みます。それを、"最後の単文"を先頭にして、その条件として"単文1"から"単文n"を後に置きます。
例えば以下の例を見てください。
#xが#yを好きで、 #yが#xを好きならば、 #xは#yの恋人である。 ↓変換 <M2 恋人 #x (#y)> <M1 好き #x (#y)> <M1 好き #y (#x)>;
"最後の単文", "単文1"~"単文n"の順番に並べ替えることによって、"単文1"~"単文n"ならば"最後の単文"という意味を表します。
prologで言えば、以下のようなプログラムと同等です。
M2(恋人 #x [#y]) :- M1(好き #x [#y]) M1(好き #y [#x]).
「紫」のプラグラム要素には、事実や要素の関係を定義する「定義文」と事実や要素の関係について問い合わせる「疑問文・命令文」があります。
「定義文」によってプログラムを定義し、「疑問文・命令文」でプログラムを起動する仕組みです。
定義文には次に示すような3種類があります。
定義文1: 単文 単文末 "。" 定義文2: 単文 (である場合 | であれば | ...) 単文 単文末 "。" 定義文3: 複文 (である場合 | であれば | ...) 単文 単文末 "。"
定義文1は、事実を定義するのに使います。
例えば、
定義文1の例: ソクラテスは人間である。 ↓変換 <M4 人間 ソクラテス ()>;
このように定義しておけば、例えばデカルト言語では変数#kindを使って、"? <M4 #kind ソクラテス ()>;"のように問い合わせればパターンマッチ(unify)されて、#xに"ソクラテス"が得られます。これは、ソクラテスが何かと尋ねると人間であると返してきたということを示します。
prolog言語では以下のように書いたのと同様です。
M4(人間 ソクラテス []).
定義文2と定義文2は要素の関係について定義するのに使います。
例えば、
定義文2の例: #xが人間であれば、#xは言葉を使う。 ↓変換 <M1 使う #x (言葉)> <M4 人間 #x ()> 定義文3の例: #xは、言葉を使うかつ、#xは文字を使うかつ、#xは、社会を形成するならば、#xは文化を持つ。 ↓変換 <M1 持つ #x (文化)> <M1 使う #x (言葉)> <M1 使う #x (文字)> <M1 形成 #x (社会)>;
prolog言語では以下のように書いたのと同様です。
M1(使う #x [言葉]) :- M4(人間 #x []). M1(持つ #x [文化]) :- M1(使う #x [言葉]), M1(使う #x [文字]), M1(形成 #x [社会]).
疑問文は、定義文とほぼ同じ構文なのですが、単文末が異なります。
疑問文では、単文末が次に示すようなものです。
ですか | か | であるか | するか | したか | しますか
文末の最後には、"。"または"?"を置きます。
例えば、以下のようなものが該当します。
桶屋が儲かるか? プラトンは、書物を残すか? #xがワカメの母親であるとき、#zがワカメの父親であるか。
これらは次のように変換されます。
#xがワカメの母親であるとき、#zがワカメの父親であるか。 ↓変換 ? <回答 (<M2 母親 #x (ワカメ)> <M2 父親 #z (ワカメ)>)>;
最初の"?"が、デカルト言語としてその後の述語プログラムを実行することを示します。
その次の回答という述語はメタな述語です。引数に指定された述語プログラムをメタに実行します。
回答述語の引数に設定されるのは、定義文であった場合とまったく同じ形に変換されていることに注意してください。
? <回答 (<M2 母親 #x (ワカメ)> <M2 父親 #z (ワカメ)>)>; ↓回答に変換 フネは、ワカメの母親である場合、波平は、ワカメの父親です。
そしてその実行結果が帰ってくると、変数に結果が反映されます。 上の例だと#xに"フネ"、#zには"波平"と結果が入るとしましょう。
回答述語は、引数の述語の結果を得てその結果から回答の日本語に変換します。
構文ごとにM2などのラベルが付いているので、回答述語は、述語プログラムの実行結果から元の日本語構文に正しく戻すことができるようになっています。
命令文では、やはり単文末が次に示すように異なります。
してください | して下さい | して | しろ | せよ
文末の最後には、"。"を置きます。"?"は置けないので注意してください。
例えば、以下のようなものが該当します。
ハローワールドを実行してください。
次のように変換されます。
ハローワールドを実行してください。 ↓変換 ? <回答 (<M5 実行 ハローワールド ()>)>;
疑問文とまったく同様に回答述語の引数に変換されます。
「紫」では、疑問文と命令文は表現が異なるだけで、同じ回答述語に変換されます。
次に示す例を見てください。
ハローワールドを実行してください。 ↓変換 ? <回答 (<M5 実行 ハローワールド ()>)>; ハローワールドを実行しますか? ↓変換 ? <回答 (<M5 実行 ハローワールド ()>)>;
疑問文や命令文の論述が、その前に定義されている定義文から真であるかわからない場合があります。
そのような場合には、回答述語が回答文の文末を以下のような形式にして回答します。
~ ではありません。
例えば次に示すようになります。
UFOは存在しますか? UFOは、存在ではありません。 砂漠を緑にしろ。 砂漠を緑にではありません。 良い政治ができますか? 良い政治は、できますではありません。 明日は雨かわかりますか? 明日は、雨かわかりますではありません。
多少ぎこちないですが、 真であるか不明な場合には、「ではありません」と否定されます。
疑問文や命令文では、解が複数ある場合には最初に見つかった解を回答とします。
複数のすべての回答を得たい場合には文末を以下のようにしましょう。
~ であるすべて ( 。| ? )
例えば、次に示すようにです。
紫式部は、#xを#yするすべて? ... 回答 ... 紫式部は、言葉を使うです。 紫式部は、文字を使うです。 紫式部は、社会を形成です。 紫式部は、記録を残すです。 紫式部は、文化を持つです。 紫式部は、書物を残すです。 紫式部は、良い文を書くです。
このように複数の回答をすべて得るためには、次に示すように「回答すべて」述語にコンパイルされて実行します。
? <回答すべて (<M1 #yする 紫式部 (#x)>)>;
「回答すべて」述語では、引数を実行して成功するたびに回答を表示してから、バックトラックして他の解を探します。 すべての回答を表示し、バックトラックしても解が得られなくなると終了します。
回答述語は、引数の述語を実行して、その結果から回答文を合成します。
回答述語の中で実行する述語には、先頭のラベルがM1~M5の5種類があります。
このラベルにより、回答述語は回答文を適切に合成します。
それぞれの構文ごとに次に示すように回答文を作成します。
M1構文 : '主語' は { ~ と} '目的語' を '述語' 単文末 。 M2構文 : '主語' は { ~ と} '目的語' の '述語' 単文末 。 M3構文 : '主語' は { ~ と} '目的語' に '述語' 単文末 。 M4構文 : '主語' は '述語' 単文末 。 M5構文 : '目的語' を '述語' 単文末 。
日本語プログラミング言語「紫」のソースの全体と詳細について上のリンク先で説明します。
--
--
[PageInfo]
LastUpdate: 2011-09-07 02:29:57, ModifiedBy: hniwa
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:login users