まったり アイマス2

アイドルマスター2 超ライトユーザーのプレイ日記

3125. PROLOG解説、その11

2020年07月30日 | 日記

 構造化プログラミングの繰り返しは、PROLOGなど、繰り返し用の構文が無い言語では、末尾再帰を使います。自分を呼び出した(再帰)時に、最後なので他の処理が残っていない場合(末尾)で、わざとらしい例だと、

try :- write('無限 '), try.

です。やってしまったら、これは無限ループなので止まりませんから、コントロールキー(Ctrl)を押しながらCのキーを押します(割り込み)。この操作を以下、Ctrl-Cと記述します。AZ-Prologでは、Ctrl-Cで止めると、次どうしましょうか、の案内が出てくるので、aのabortを選びます。

 なので、当然ながら普通はループ脱出用の判断・分岐を用意します。計数とリスト処理が代表的で、以下、説明。

 計数の方は、C言語だとfor(i = 0; i < 10; i++){ };みたいな感じで、表作成が練習としては出てきますが、現実的には配列操作(ベクトルと行列)が主な応用だと思います。PROLOGには標準の配列がありませんから、とりあえず表作成で行きます。

% p07.pl; 200730; author; 計数繰り返し

try :- !, write('構造化風繰り返し、その1'), nl, do0.

do0 :- !, write('角度: sin, cos.'), nl,
  do1(0, 181, 15), write('終了'), nl.

do1(X, Y, Z) :- X >= Y, !.
do1(X, Y, Z) :- X < Y, !,
  write(X), write(': '),
  S is sin(X * pi / 180), write(S), write(', '),
  C is cos(X * pi / 180), write(C), write('.'), nl,
  X1 is X + Z, do1(X1, Y, Z).

 つまり、ループ本体の入り口に専用の述語(do1)を用意します。ループの設定は前座の述語、do0がやります(必要なら後始末も)。
 これは私のやり方ですが、多分、PROLOGに構造化プログラミングを導入するなら、こうなると思います。後で多分、二重ループの例を書きますから、疑義のある方(特にPROLOGフリークの方々)はそれを見てから私に文句を言うかどうか、ご判断ください。

 述語do1の最後の節の最後の項が末尾再帰です。do1述語の最初の節が終了条件です。処理内容は、三角関数sinとcosの値の表の作成です。実行してみると、あまり見やすいとは言えませんが、計算機が普及していなかった時代では実用と思います。
 見やすさは重要なので、私に時間と意欲があれば工夫してみます。
 なお、piが円周率なのはAZ-Prologのサービスです。無ければ、大昔のパソコンBASICみたいに、atan(1)*4で代用します。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3124. PROLOG解説、その10

2020年07月29日 | 日記

 構造化プログラミングは、プログラムを3つの要素、逐次処理、判断・分岐処理、繰り返し処理にまとめて、可視性を良くします。構造化プログラミングは非常に強力で、フローチャートを過去のものにしてしまいました。

 逐次処理はPROLOGでは節のゴールを並べることになります。hello, world.もそうでしたが、念のため。

% p05.pl; 200729; author; 逐次実行例

try :- !, write('逐次実行例: try(5). 等入力'), nl.

try(X) :- !, write(X), write('**2 = '), Y is X**2, write(Y), nl.

などとなります。実行例は、

| ?-try.
逐次実行例: try(5). 等入力
yes
| ?-try(5).
5**2 = 25
yes
| ?-try(12).
12**2 = 144
yes
| ?-halt.

 まず、最初の%で始まる行は注釈です。練習用のプログラムでも最低限の説明は残しておきます。%から行末までがPROLOGの注釈です。私の好みは、一行目にプログラム名、日付、作者名、題名みたいなの、を書いておくことです。
 2行目も私の好みで、いきなりtry.と入力すると、入力案内が出てきます。
 実行結果は入力した数値の2乗を表示するだけです。try(1.2)などを試してみましょう。

 ところで、カット述語「!」が使用されています。カットはPROLOGの唯一の実行制御で、この述語(節ではなく)はここで確定した、との意味です。逐次実行例なので、他の可能性はありませんから、いきなりカットを使っています。

 次は判断と分岐。これには節を分岐の分だけ用意して、頭部と本体の最初の方に条件を書き、そこで判断が確定しますからカットを置いて、本体の残りで分岐後の処理を書きます。

% p06.pl; 200729; author; 判断と分岐

try :- !, write('判断と分岐の例、偶奇判断: try(5). 等入力'), nl.

try(X) :- X mod 2 =:= 0, !, write(X), write('は偶数'), nl.
try(X) :- X mod 2 =\= 0, !, write(X), write('は奇数'), nl.

 ここで「=:=」は数値の比較で、等値だと成功する述語で、「=\=」は非等値で成功する述語です。modは剰余です。
 「=:=」でなければ「=\=」ですから、2行目の「=\=」は一見不要で、取り除いてもこの場合は正しく動作しますが、PROLOGではデフォルト処理(C言語のELSE)をこの位置に置くのは危険だと言われています。ELSEの処理は前処理の述語に書くのが定石のようです。ですから、分岐する述語は必ず判断を!の前に書く、のが安全です。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3123. PROLOG解説、その9

2020年07月28日 | 日記

 これからPROLOGのプログラムがたくさん出てくるはずです、多分。
 整理するにはWindowsのフォルダ = ディレクトリを1プログラムごとに作るのが良いと思います。UNIXやMacを使っている方にも参考になると思います。

 ディレクトリはWindowsのエクスプローラーで作ります。練習用にはp01とかの名前で良いでしょう。
 プログラムのファイルはp.plとかごく適当で良いでしょう。ファイルはマウスの右ボタン→新規作成→テキストファイル、で作成し、名称を変えます。
 拡張子(.txtとか.plのこと)は見えている方が良いので、エクスプローラーの表示リボンのファイル名拡張子にチェックを入れておきます。

 プログラムの打ち込みは普通のエディタが便利と思います。私はoeditというのを使っていますが、好みには個人差が大きいので、お好きなエディタをお使いください。拡張子.plをこのエディタに結びつけると、プログラムの修正が容易となります。

 PROLOGプログラムには開始用の述語を作っておくと便利です。たとえば、p.plの内容は、

try :- write('hello, world.'),nl.

 などとします。tryは私の好みと言うだけで、runとかmainとかお好きに。

 最後に、AZ-Prolog起動用のバッチファイルを作ります。テキストファイルの名前をp.batみたいに、拡張子.batとします。その中身は、

prolog -c p.pl

の感じ。-cは述語consultのことで、Prologインタプリタ内からプログラムを読み込むときに使います。これと同じ事を起動時にさせるのが、この書き方です。

 エクスプローラーからp.batを開く(ダブルクリックなど)と、まずWindowsのコンソール画面が現れ、次にAZ-Prologのコンソール画面が現れます。prologのコンソールの方で、

| ?-try.

と質問すると、

hello, world.
yes

と、プログラムの実行結果が表示されます。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3122. アイドルマスター、15周年の日、続き

2020年07月27日 | 日記

 まあ普通に、PS4の最新アイマスゲーム、ステラステージのPV新着欄で普通にお祝いPVが有志Pによって上げられていました。私も参加しているグループの仕掛け人が…、なので8月1日にこの件に関してお祭りするらしいです。伝説のPとか来てくださるかな。

 最初はアイドルゲームと言う、身も蓋もない仮の題名だったようです。初期メンバーのとあるゲーム雑誌に載った開発中イラストがあって、多分、この時はアイマスのコピーライトになっている窪岡氏の絵です。春香(普通のよくある女の子、だそうです)が筆頭なのは最初から決まっていて、諸般の事情から美希はいませんが、響と貴音みたいなのがいるのが目を引きます。
 繰り返しますが、この時の開発動機は私の理解では、ナムコゲームセンターにじり貧が予想されたため、アイドルで客寄せしよう、という何というかべたべたの現実的な理由で春香たちは生み出されたみたいです。開発開始は2001年で、ロケテストを経て、最初のアーケードのアイドルマスターにこぎ着けた見たいです。

 ちなみに、アイドルマスターはゲームのユーザー、つまりプロデューサー(P)のことです。
 開発当時、アイドルが流行していた、とのことで、多分、山口百恵とか桜田淳子(知らない?)のことを指すのでしょうが、美空ひばりとか、そんなこと言ったら出雲阿国とか、天岩戸(あまのいわと)のアメノウズメも多分、当時の芸能人です。ギリシア時代の演劇場も残っているはずだし、演劇とか音楽の歴史はものすごく古いです、が、古代の芸能の再現は無理だし、今見ると、つまらないというか時代背景が分からないと想像します。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3121. アイドルマスター、15周年の日

2020年07月26日 | 日記

 しばらく前から、アイドルマスター15周年の表示が出ていましたが、本日7月26日がアーケード版の稼働開始(2005年)から15年目のようです。
 本ブログは2011年開始で、アイドルマスターにはそれまではほとんど関心がありませんでしたから、アケ版どころか初代Xbox360版のこともよく知りません。

 稼働しているアーケード版を初めて見たのは、2012年のとある同人誌販売会の会場で、筐体を買ったPがプロジェクタに接続して(中身はPS2とのこと)プレイしていました。
 その後、とあるナムコゲームセンターでしばらく稼働していました。その頃はオンラインサービスは停止していたと思います。画面タッチ式のリズムゲームで、かなり厳しいゲームで、1年間の売り出し期間を貫徹するだけでかなりの金額を要したようです。そのため、アイマスPは30代男性のサラリーマンの印象があります。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3120. PROLOG解説、その8

2020年07月25日 | 日記

 普通の構造化プラグラミングをPROLOGで実行する場合の書き方を示すのが本稿の最初の目的ですが、いきなりそれをやると、じゃあPROLOGの存在意義は何ですかと質問されそうです。
 ですから、まずは一例だけですが、典型的なPROLOGのプログラムを紹介します。
 とある参考書で、member述語を理解するのが早道、と言われていたので、ここでもそれを踏襲します。

 member述語はリストの中に項が含まれていれば真、含まれなければ偽となる述語です。
 たとえば、
| ?-member(a,[b,a,c,d]).
yes
| ?-member(e,[b,a,c,d]).
no
です。PROLOGが独特なのは、第1引数に変数が指定できることです。
| ?-member(X,[a,b,a,c]).
X = a
yes
ですが、X = aの所でカーソルは止まっていて、リターンキーを押すとyesが現れます。
 単にリターンでは無く、セミコロンを入力すると、別解を探せの意味になって、
| ?-member(X,[a,b,a,c]).
X = a;
X = b;
X = a;
X = c;
no
となります。

 member述語は組み込み、つまり最初から定義されていますが、作るなら、

member(X,[X|_]).
member(X,[_|L]):- member(X,L).

です。これがPROLOGのプログラムで、述語を作ることに相当します。
 まず用語で、述語は単数または複数の節(clause)から構成されます。慣例として、通常は1行に1個の節を書きます。節は頭部(head)の項とピリオドだけの事実(fact)と、:-の右側(本体(または体部)(body))にゴール(goal)と呼ばれる項をカンマで並べてピリオドで閉じる規則(rule)の、2形式があります。member述語の2行目のゴールは1個だけです。

 1行目の意味は、第1引数の項がリストの頭部と一致すれば、真。2行目は、一致しない場合は、リストの尾部を探せ、です。
 ;は、強制バックトラックで、一般にPROLOGの述語は複数回、真になります。手動では無く、解を集めるための特別な述語があります(setof/3、bagof/3、findall/3)。

 規則の方の一般形式は、
 A :- P, Q, R, ... , Z.
の形で、論理式風に書くと、
 A ← P∧Q∧R∧ ... ∧Z
で、P~Zが全て成り立てばAも真である、と読めます。PROLOGでは逆方向に、Aが成り立つのを確かめるためには、P~Zが全て真であることを確かめる、と動作します。

 ところで、一階述語論理の述語をうまく整理すると、
 A∨B∨ ... ∨N ← P∧Q∧R∧ ... ∧Z
の形の節の集合になるそうです。PROLOGの節は頭部の項が1個だけのホーン節と呼ばれる形式で、そのために効率が確保できるとのこと。一般には普通の節をホーン節に分解することはできないそうです。つまり、
 A ← P∧Q∧R∧ ... ∧Z
 B ← P∧Q∧R∧ ... ∧Z
  ...
 N ← P∧Q∧R∧ ... ∧Z
とすると、矢印の右辺が重複してしまうからで、私の理解では、そのためにカット述語とかガードとか呼ばれるものがあります(他の可能性を捨てる)。私の妄想では、多世界解釈を防ぐ機構がこの世にも存在する、と、ここのあたりの仕掛けを解明するのは大切と思います。

 この手の学術的話題は、本シリーズではここまでとします。次回からはひたすら実用方向の話になるはずです。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3119. PROLOG解説、その7

2020年07月24日 | 日記

 ふう、やっとPROLOGでプログラムが組める段階に来ました。PROLOGの教科書はどれもこれも本ブログでやったようなデータ構造の話から始まります。
 最初の私のように、ここに来るまでに疲れ果てて、BASICに籠もっていても何も困らない、とか考えてしまうと思います。それでも良いです、本当。万能チューリングマシンの証明は伊達ではないです。PROLOG処理系はBASICで書けて、BASIC処理系はPROLOGで書けます(やったことないけど)、速度とメモリの限界を考えなければ、の話ですが。

 C言語の入門は「hello, world.」(こんにちは、世界の国から)の印字からと決まっています。PROLOGでも簡単で、質問、
?-write('hello, world.'),nl.
で、
hello, world.
と表示されますから、これでおしまい。

 いや、簡単に片付けるなよ、の声にはお答えせざるを得ないでしょう。
 まず、PROLOGの端末装置への出力の基本は、write述語とput述語です。入力の基本は、read述語とget述語です。これだけ。
 なのですが、容易に想像できるように、この基本述語だけではまともな画面設計とキーインができないです。ここは対話プログラムにとっては重要なので、後ほど使える述語を作るとして、とりあえず、writeとnl(改行)はどしどし使って良いと思います。
 コンソール画面の消去は、通常はエスケープシーケンス(ハードまたはエミュレータの端末装置で対応している必要あり)というのを使いますが、AZ-Prologにはd_clear述語が用意されているので、こちらを使います。

 ISO標準Prologは、なぜか文字列についてしつこく探求されていて、これはこれで便利なので機会があったらまとめてみたいです。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3118. PROLOG解説、その6

2020年07月22日 | 日記

 リスト記法には、さらに一つ書き方のパターンがあって、これが最後です。
 リストはPROLOGでは不定個(0~∞)の要素(データ)を並べる唯一の手段なので、頻繁に出てきて、パターンマッチさせる場合に、いちいち、
 .(X, Y)
と書くと目がチラチラしてしまいます。見た目がリストと違うし。ですから、
 [X|Y]
と、縦棒で区切る書き方が用意されています。もちろん、.(X, Y)と書いても良いのですが、普通は[X|Y]を選択します。

 [X|Y]のXはリストの頭部(head)、Yはリストの尾部(tail)と呼ばれます。たとえば、
?- [X|Y] = [a, b, c, d, e].
とPROLOGに質問すると、
X  = a,
Y  = [b,c,d,e]
の答えが返ってきます。つまりリスト[a, b, c, d, e]の頭部はaで、尾部は[b, c, d, e]です。これは、.(X, Y)の書き方の方が意味が分かりやすいと思います。つまり、リストは二進木(二分木、binary tree)の一種です。
?- [X|Y] = [e].
とPROLOGに質問すると、
X  = e,
Y  = []
と、最後に隠れていた空リストが表に出てきます。つまり、通常のリストの二進木では、右端の節(葉)は必ず空リストです。ここを普通の項にすることも普通にできますが、リスト処理では右端が空リスト以外のリストはめったに使いません。

 以上はリストの分解の基本です。リストにデータを付け加えるときも[X|Y]を使います。たとえば、
?- X=a,Y=[b,c],Z=[X|Y].
とPROLOGに質問すると、
X  = a,
Y  = [b,c],
Z  = [a,b,c]
と、ちゃんと繋がります。

 初級者の理解としてはここまでで良いのですが、Prolog使いと呼ばれるためには、さらに2点の考察が必要です。

 まず、リストからデータを取り出すときは頭部から取り出すことになります。リストにデータを加えるときは頭部にくっつけることになります。これはデータ構造としては、リストはスタック構造、LIFO(last in first out)、先入れ後出しです。つまり、右端のデータに到達するには、ずっとたぐって行かないといけないわけで、添え字でどのデータにも瞬時にアクセスできる配列より非効率になります。
 配列は通常は最初に長さを決めないといけませんから、計算途中でいくらでも伸ばせて縮めることができるリストとは用途が微妙に異なります。
 PROLOGの場合は、ずっと後で述べる差分リストで、あっと驚く、お尻にデータをくっつけることもできて、ですから私はとても重要なテクニックというか、言語仕様だと思っている訳。

 もう一つは、.(X, Y)は単なる記法では無く、計算時にメモリを、リストを伸ばした分だけ消費する点です。追加されるのは対(pair)とかconsセルと呼ばれる、ポインタ2個からなる構造体です。もちろん、PROLOGではhead部とtail部と呼ばれるはずです。

 LISPではこれをcar部とcdr部と呼んでいます。cdrの発音はクダーです。リストの頭部を1個伸ばす関数はconsと呼ばれ、consが作動すると対が生成(メモリが割り当て)されて、carとcdrのポインタがセットされます。これがconsセルの名前の由来です。
 この関数carと関数cdrの名称は便利で、
 (cadr x)
と書くと、
 (car (cdr x))
の意味になって、たとえば、
 (cadr '(a b c))
だと、値は2番目の要素のbになります。
 PROLOGでは、こういう場合に
 [X, Y|Z] = [a, b, c]
と書くと、Yがcadrに相当します(bと結びつく)。Xは普通のcarで(a)、Zはcddrです([c])。縦棒の左にはもっとカンマを使って変数などを並べることができます。しかし、縦棒の右にカンマを置くことはできません。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3117. PSストアでセール中

2020年07月22日 | 日記

 PSストアでPS4のダウンロード版のアイマス3作品が短期間の値下げ中です。めったに値下げされませんので、関心のある方は今の機会に。
 現行のアイマスはステラステージです。シンデレラガールズ・ビューイングレボリューションはPS-VR、つまりゴーグル型の専用VRディスプレイが必須です。プラチナスターズはステラステージの前作で、諸事情から今は特にお勧めしません(状況が変わっていれば別ですが…)。

 8月にはPS5の詳細が発表されると言われているので、多分、PS4での大規模なセールは今回が最後か、その一つ前か、みたいな感じと思います。
 ソニーではありませんが、PS5の世代ではいわゆるpro、つまり上位機種は発売されないだろうとの意見があったようです。というのは、今、そういった装置を組むととても高価になるそうです。
 しかし、技術的には少なくとも我が国では8Kの初期段階はとっくに開発済みで、この分だとアメリカにもヨーロッパにも対応できるメーカーは多数あると思います。対応していないのは現行のPC系だけのような気がします。つまり、対応は可能と思います、やることやればですが。
 とにかく、8K/HDR/120Hzのテレビは現存する訳で、それ+α(VRなど)まではどうやったって進化します。その先は確かに新たなイノベーションが必要でしょう。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3116. PROLOG解説、その5

2020年07月21日 | 日記

 複合項には演算子(operator)の書き方があります。たとえば、
 +(3, 5)
は、
 3 + 5 とか、空白無しで 3+5
と書いても良い、ということ。要するに普通の演算子です。op述語というので定義しますが、+や-などの普通に使う演算子は最初から定義されていて、いきなり使えます。

 最後の複合項の記法はリスト(list)です。LISPでは丸括弧で空白区切りですが、PROLOGでは角括弧でコンマ区切りを使います。たとえば、
 [a, b, c, d, e]
みたいなの。
 LISPでは(a b c d e)の書き方で、関数もプログラムも表現します。しかし、PROLOGには関数記法がありますから、リストは単に項が順に並んでいるだけです。ですから、先頭から順番に同様の処理をする場合に使います。

 リストの肝は、要素が単純項だけで無く複合項でもOKなことで、特に、リストが入っていても、何重に重なっていても構いません。思いつきで書くと、
 [a, [b, [c, d]], e]
などで、もちろん左括弧と右括弧は対応している必要があります。

 ややこしいのはここからで、私はLISPの時に説明を読んでも理解できず、実際の処理系を数年後に手に入れてからやっと分かりました。分かってしまうと簡単です。
 LISPにはさらに(QUOTE A)という頻繁に出てくる特殊形式があって、これも処理系で試さないと何が何だかですが、幸いなことにこちらはPROLOGには出てきません。
 一応説明しておくと、近代LISPでいきなりAという記号が出てくると、その値と解釈されます。たとえばAの値が5だったとすると、5と解釈されてしまうので、解釈(評価)を止めるには(QUOTE A)または'Aと書かないといけません。リストはリストで、(A B C)は関数名がAでその引数がBとCの関数と解釈されてしまうので、評価を止めるには'(A B C)と書きます。PROLOGではQUOTEは不要です、というかアトム自体には値も関数定義も入っていません。

 まず、空リスト(enpty list)と呼ばれるアトムがあります。[]と書いて、要素のないリストに見えて、実際、リスト扱いされます。LISPでは()と書いてもnilと書いてもOKですが、PROLOGは[]だけです。
 次は、リストは実は略記で、「.」(ピリオド)がファンクタのアリティ2の複合項が実体です。つまり、
 .(a, []) は [a]
で、
 .(a, .(b, [])) は [a, b]
で、くどいですが、
 .(a, .(b, .(c, []))) は [a, b, c]
となります。
 ちなみにLISPではリストのドット記法と言って、同じ事をLISPのリストで書くと、
 (a . nil) は (a)
 (a . (b . nil)) は (a b)
 (a . (b . (c . nil))) は (a b c)
です。
 さらにくどいですが、PROLOGの.は中置子の演算子では無いです。そのように書いている教科書もありますが、再定義しないと動作しません。

 長くなるので、これも続きます。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3115. PROLOG解説、その4

2020年07月19日 | 日記

 さっさと具体的プログラムに移りたいところですが、実はPROLOGには標準の大域変数と配列がありません。もちろん無ければまともなゲームどころか、科学技術計算など不可能ですから、実際上、実用を目指しているPROLOG処理系には相当品が用意されているようです。AZ-Prologにもあります(アレイ)。
 では、複数のデータが扱いたくなったときに何を使うかというと、それがリストと呼ばれる複合データです。これはPROLOGでは複合項の一種なので、先に普通の複合項から。

 複合項(compound term)はファンクタ(functor)と引数(ひきすう)(argument)と呼ばれる項の(カンマで区切られた)系列を括弧で閉じたもの、として表されます。つまり、
 f(a, b, c)
の形です。この本来の形(エジンバラ形式での)は関数記法(functor notation)とか、AZ-Prologでは述語形式と呼ばれています。後に散々出てくる述語が、この形で表現されるからです。
 結構重要な言葉にアリティ(項数)があります。引数の項の個数で、上記の例だとアリティは3です。ファンクタが異なれば当然別の述語ですが、アリティが違うだけでも別の述語の扱いになります。マニュアルでは「ファンクタ/アリティ」が解説の単位になっています。

 PROLOGは歴史が浅くて初期の混乱が続いている間に流行が去ってしまったので、このあたりの用語に結構なブレがあります。まず、ISO標準では複合項では無くて構造体(structure)と呼ばれていて、本来はこちらのようです。しかし、大抵のPrologプログラマは複合項と呼ぶと思います。
 余談ですが、国際標準が無視されまくっている分野は結構あると思います。私の関わる分野では、電子回路と論理回路の記号は米国流(だと思う)が主流で、国際標準はちっとも流行っていません。
 ファンクタは関数子の訳がPROLOG界では一般的と思います。AZ-Prologでは述語名と記されています。辞書を引くと関数記号、関手(圏論の用語)が出てきます。引数は要素(component)と呼ばれることがあります。
 特に一般的な言葉でも無いので、本シリーズではファンクタとアリティをカタカナのまま使います(気まぐれで和訳を付けます)。アトムも原始記号という訳はあるものの、そのままで。どのカタカナ語もProlog使いにはまず間違いなく通用します。

 複合項は述語や数学関数を書くときの書式ではありますが、これは出てくる位置による解釈で、本来は単なるデータです。特定と関係に使います。たとえば、
 human(alice).
 human(bob).
は、「事実」を示します。
 friend(alice, bob).
は関係です。最後にピリオドが付いているのは、PROLOGのプログラム領域 = データベースに書くときの書式です。

 長くなったので、続きます。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3114. あずさの誕生日

2020年07月18日 | 日記

 明日、7月19日は765アイドルの一人、三浦あずさの誕生日だそうです。いつものように、PS4のアイマスゲーム、ステラステージの新着PVに有志Pがお祝いのPVを上げるはずです。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3113. PROLOG解説、その3

2020年07月17日 | 日記

 PROLOGの変数はC言語などをやっていると、最初はかなり変わったものに見えます。

 まず、一階述語論理のどこから変数の概念がやってきたか、というと、全称∀と存在∃のことだそうで、そういえば、∀xとか∃yとか学校で習ったような。
 …ようなって、実は、今回このブログでPROLOG解説するまで意識していませんでした。うむ、PROLOGが命題論理だけで無く、一階述語論理を扱えるのは変数が存在するからだ、とのこと。
 なので、PROLOGの変数の有効範囲はとても狭く、節、つまり1行内だけです。しかも、一旦定数と結びつく(束縛)と二度と離れません。通常のプログラミング言語でいう代入が不可能です。この最初の定数との結びつきは、C言語などで言うと初期化に相当します。
 これもあまり知られているとは言い難いですが、初期化と代入は異なります。C++でクラス定義まで進むと意識せざるを得なくなります。
 また、面白いことに未代入の変数同士を束縛することができて、これを利用して、ずっと後から変数に定数を束縛すると、元の変数まで確定してしまいます。このあたりは理論的にも面白そうです。

 具体例は事情があって、次項以降になりそうです。というのは、今週はなぜか忙しくて、対応するC言語のプログラムを動作させるためにvisual studio 2017を起動させないといけないのですが、しばらくご無沙汰していたのでとっさに操作が思い出せず、少々時間を頂きたい、ということ。
 つまり、私の意見では、C言語でも一切代入を使わずに、つまり初期化だけでプログラムが組めると思っているからです。多分おそらく、こちらのC言語のプログラムの書き方の方が衝撃的に思える方が多いと思いますので、ぜひPROLOGの同等のプログラムと並べて書きたいです。

 現在のPROLOGの記法、エジンバラ記法での変数は、英大文字またはアンダーライン「_」で始まる英数字とアンダーラインの文字列で表されます。ですから単にxは定数になってしまって、Xとか_xとかにしないといけません。AZ-Prologでは名前に漢字が使えますが、その場合の変数には半角のアンダーラインを前に付ける必要があります。
 また、時にダミーの変数、つまり他で使わない変数が欲しくなることがあって、アンダーライン1文字で表します。この場合は特例で、他の1文字のアンダーラインがあっても、別の変数として扱われます。AZ-Prologではこの特別な変数を虚変数と記しています。元は無名変数(anonymous variable)なので、本ブログでは意訳のこちらを使うことがあると思います。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3112. PROLOG解説、その2

2020年07月16日 | 日記

 昨日、動作が妙になったと思っていたDP-X1Aアイマスバージョンは、どこかのプログラムの間違い動作らしく、電池をすっからかんにして完全リセットすると戻りました。この機種は電池が取り外せないのでこうした、というかこうなってしまった感じ。

 論理型プログラミング言語、PROLOGのデータは、項(term)と呼ばれています。数学や論理学の項のことです。英語のニュアンスとしては単に言葉、特に技術的な用語・述語の感じです。しかし、Prologの文脈で、日本語で述語と言ってしまうと、真偽が決定できる文章、つまり述語(predicate)になってしまうので、項と呼ばれているみたいです。

 単純項と呼ばれるものが基礎的なデータ型で、定数と変数です。
 定数にはアトムと数があります。元々のPROLOGでは数はC言語で言うint、つまり1アドレスに入る符号付き整数だけ、というのが普通の時代がありました。64bit版AZ-Prologでは、整数と実数の区別があって、整数は符号付き64bit整数、実数はIEEE倍精度浮動小数点数(64bit)です(混在させると自動変換されて普通に加算とかになるのはC言語などと同様)。

 アトム(atom)は物理・化学の原子のアトムのことで、LISPのアトムと同じ意味。これが本来のPROLOGの単純データです。C言語などでは直接はデータとして扱えないので、計算機入門を済ませてしまった方は、かえって分かりづらく感じるはずです。
 具体的には、「+」や「=」や「if」や「while」や「sqrt」や「cos」の事で、今のLISPでは記号(symbol)と呼ばれているものです。ifをiとfに分解すると意味が無くなるので原子と呼ばれます。C言語でもLISPでも、変数名や関数名になります。Prologでは述語名や関数名になります。
 ですから、C言語などの普通の計算機言語ではアトムはコンパイラが意識しているだけで、つまり文法上だけの存在です。しかし、LISPやPROLOGでは基本データです。識別子として使い、つまり、「alice = alice」が真で、「alice = bob」が偽になる、これだけのこと(LISPではeq関数)。定数なのか関数名なのか、何を意味するのかは出現場所に依存します。
 ここは大変重要なので、多分、どこかに続きます。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3111. PROLOG解説、その1.5

2020年07月15日 | 日記

 ううむ、アイマスバージョンのハイレゾ再生機、DP-X1Aの調子がおかしくなりました。3年間ほど酷使していたので、こんなものかも。スターライトステージとライブオンステージが入っていて、ソシャゲ専用機になっていたスマホでと。いつものようにsideMの方は移行失敗、ですけど、以前に失敗してまともにやっていないので、まあいいや。
 スターライトステージはさすがというか、しっかり移行できました。

 で、PROLOG入門と意気込んではみたものの、しばらく遠ざかっていたし、めったに無い機会なので、この際基礎固めと。具体的には、前述のクロックシン/メリッシュの論理プログラミングの基礎部分の読み直しと、文法再チェック。基本的に通勤時間帯で。
 以前は動作していた部分が新バージョンでは動かなくなって、まあ、基本的な部分は普通に動作するので、このままAZ-Prologで続けます。もう一回トラブルが起こったら、さっさとSWIに移行する予定です。

 プログラムが大きくなると、エディタを使いたくなります。AZ-Prologには専用のエディタが付属しています。これは便利ですが、汎用では無いので私がいつも使っているエディタを使うことになります。この場合、便利に使うには多少の工夫が必要です。ある程度話が進む見込みが出てきたら、その時にどうやっているかを紹介します。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする