Prologでまったり Part3

このエントリーをはてなブックマークに追加
727デフォルトの名無しさん
>>726
卒業研究でRDBの論文を読んだら、クエリがprologみたいな文法で記述してあって、
「これ、どのDBMSなんですか?」と聞いたら、論文での表記だけがprolog風なだけで実装はSQLだったのを思い出した。

あと、JavaCCで簡単なパーサを作って、prologの問い合わせをSQLに変換してた人もいた。

とりあえず、こんな感じでいいと思う。リストはメンバ関数を駆使する必要があると思う。

P(x, _) :- Q(x), R(x, y), y>=100.

select x from P,Q,R where x.P = x.Q and x.Q = x.R and y.R >= 100;

というか、そもそもprolog自体もデータベースなんですけどね。
728デフォルトの名無しさん:2008/12/20(土) 12:52:30
>>726
もちろんできる。
ただ、SQLに変換しなくてはならないとすると、あまり旨味がない。
この方面の課題とか考えでところについては、このスレでも何度もでてきた。
SQLに変換せずにということになると、現在のDBMSの能力の半分位は捨ててと
いうことになるが、MySQLやPostgreSQLのSQL解析の部分をそっくりPrologの
解析に取り替えてしまうという方法がある。やるならそこだが、Prologの表現に
できるだけ制約を加えたくないし、そうすると遅延評価の問題とか、探索木が
大きくなった場合とか、データベースの高速の探索アルゴリズムに変換することは
易しくはないと思う。
それより、今なすべきことは、Prologをオンメモリデータベースとして実用に耐える
水準に引き上げることだと思う。これができて使い込まれればPrologインターフェイスの
展望が開けてくる。
729デフォルトの名無しさん:2008/12/20(土) 13:57:42
つーか、prologって外延データベースじゃないの?
730デフォルトの名無しさん:2008/12/20(土) 14:18:10
>>729
少し前にでてきた、単位節プログラミングがそれに当たると思う。
ただこれは、メソッド・作法であって、Prologを生かすなら、
外延的に物事を集合として記述するのが効果的で面白いということだ。
仕様から必然的にこうならざるを得ないという訳ではない。
内包的な演繹データベースとしてもSQLと同等以上に強力である。
731デフォルトの名無しさん:2008/12/20(土) 19:20:48
datalogの話でもしますか。

というより、現行のprolog処理系はまず日本語処理をなんとか
しないと駄目だろう。
732デフォルトの名無しさん:2008/12/21(日) 00:39:01
学校の課題なのですが、
[a,f,s,a,5]のなかにaはいくつ含まれているかカウントするprologを作成せよという問題がさっぱりわかりません。

counta(L,C):-
L=a,
k+1,
C is k.

これであっているのでしょうか。
もしよかったら参考になりそうなサイトとかあったら教えてください。
733デフォルトの名無しさん:2008/12/21(日) 01:41:31
…何ていうか、根本的に勉強し直したほうがいいと思うよ。
教科書最初から読み直すとか。
734デフォルトの名無しさん:2008/12/21(日) 04:12:22
>>733
counta([],[]).
counta([a|R],[a|R1]) :- counta(R,R1).
counta([_|R],X) :- counta(R,X).
または、
counta([],0).
counta([a|R],s(S)) :- counta(R,S).
counta([_|R],S) :- counta(R,S).
何が起こるのかやってみてください。
これらを提出してこれが答えだと強弁したら、
先生、君に一目置くかも。
まあ、無視される答えに作り換えてください。
735デフォルトの名無しさん:2008/12/21(日) 06:28:34
>>732
・変数は アルファベットの大文字から始まるか _ から始まる文字のならびでなくてはなりません。
・それからリストですが [a|R]の意味は先頭要素がaで残り(R)要素があります。
ただし残り要素は場合によると空([])かも知れません。そんな意味です。
[A|R] は先頭要素が変数(今のところ何が来るのか分からない)で残り(R)要素のあるリスト。
残り要素が空の可能性があることは同じです。
・Prologではリストの残りはという時は | の後にRのような変数を書きます。
変数であればRとは限りません。
・[_|R] の _ も一応変数です。これは無名変数といって、この要素は他の部分では使わないよ、
と宣言していると考えましょう。
今回はここまで。
736デフォルトの名無しさん:2008/12/21(日) 08:30:25
みなさま、ご指導ありがとうございます。

悪戦苦闘しましたが、いちおうこんな感じでできました

counta(L,N) :- findall(a,member(a,L),La), length(La,N).
737デフォルトの名無しさん:2008/12/21(日) 09:26:24
>>736
それは書きなおして提出した方が良いと思いますよ。
組み込み述語に頼らないで再帰を使ってというのが
宿題の趣旨だと思いますよ。
738デフォルトの名無しさん:2008/12/21(日) 10:12:09
そうそう。
is/2等の組み込み述語を使わずにいかに加算を実現するかがポイント。
peano数表現で求めた後、10進表現に直すところが難関だ。
739デフォルトの名無しさん:2008/12/21(日) 16:16:10
>>731
まったくだ
何やってたんだICOT
740デフォルトの名無しさん:2008/12/21(日) 19:50:33
>>731,739
何を指して問題と言うのかな?批判したいだけなんだろ。
大半の処理系で文字列として日本語は扱えるし、
日本で開発された K-Prolog あたりなら文字単位(全角/半角)の処理もできていたはず。
文節単位の処理は形態要素分析の世界だから Prolog 処理系の課題からは外れるし。
それとも日本語でプログラミングしたいのかな?こんな感じで(w

人(ソクラテス).
死ぬ(X) :- 人(X).
?- 死ぬ(ソクラテス).
741デフォルトの名無しさん:2008/12/21(日) 19:56:25
> 日本で開発された K-Prolog あたりなら文字単位(全角/半角)の処理もできていたはず。
裏返せば、大半の処理系は出来てないわけですね。

swi-prologはどうだっけ?
742デフォルトの名無しさん:2008/12/21(日) 20:01:36
>>741 SWI-Prologは、
全然問題ない。まてよ、Windows版は問題があったかな。
743デフォルトの名無しさん:2008/12/21(日) 20:19:29
全角文字だけで、プログラミングしたいと思う人は少ないようだ。
死ぬ(X):− 人(X).
?− 死ぬ(ソクラテス).
K-Prologはこれができていたはず。こういう意味での漢字処理の完全性から
Kを冠した。
744デフォルトの名無しさん:2008/12/21(日) 20:52:31
エディタの便利機能が全然効かなくなるからなあ
745デフォルトの名無しさん:2008/12/21(日) 21:58:48
Lispと同様Prologにも99問の演習があったんですね。こっちが元祖なのかな。
https://prof.ti.bfh.ch/hew1/informatik3/prolog/p-99/
746デフォルトの名無しさん:2008/12/22(月) 05:58:07
先に書いたフラットな単位節を基本とするなら、Python風にインデントして、

死ぬ(X) :-
  人(X).
人(ソクラテス).
人(アリストテレス).



死ぬ X
  人 X
人 ソクラテス
人 アリストテレス

というsyntaxから上記のProlog表現を起こすプリプロセッサを
被せるのが有力。複合項の表現が多くなると効果が薄れるから、
フラットであることが特に重要。
747デフォルトの名無しさん:2008/12/22(月) 21:31:17
swi-prolog 5.4.7 (win)で日本語を試してみた。

p.pl
a('日本語').

というfileを用意(SJIS)。


24 ?- [p].
% p compiled 0.00 sec, 0 bytes

Yes
25 ?- a(X).

X = '\223\\226\{\214\・

Yes

UTF-8にしてみたが同様。
これは駄目ですね。
748デフォルトの名無しさん:2008/12/23(火) 05:38:11
日本語処理に関しては、IF/Prologの国内販売が中止になったのが痛い。
30万円台の、今日的には高価な製品だったが、企業で実務に利用するには
十分のものだった。ドイツ版は入手できるが、日本語の部分は削ってあるようだ。
SWI-Prologも5.6.14というバージョンのUbuntu(Gnu?)パッケージだと、
変数名まで完全に日本語が使える。もちろんアトムをシングルクォーツで
囲む必要もない。
749デフォルトの名無しさん:2008/12/23(火) 06:46:27
Prologについて日本語情報としてその全容が示されたのは、
中島秀之氏の1978年の情報処理の論文や1982年4-6月のbit誌での解説では
ないかと思っていたのですが、本棚の底から久しぶりに顔をだした、
『人工知能』 岩波講座情報科学-22 の奥附を見てびっくり。私は1984年の
第二刷を購読したのだが、第一刷は、1982年4月9日とある。
この本のPrologの解説はなかなかのもので、雑誌を除くとこの本が最初の
言及なのかも知れない。以前間違った事を書いたと思うので訂正。
750デフォルトの名無しさん:2008/12/23(火) 10:10:50
>>747
http://www.swi-prolog.org/versions.html
UTF-8対応は5.6.x(開発版では5.5.x)から
751デフォルトの名無しさん:2008/12/23(火) 10:45:59
>>749
中島先生のLispで書かれたProlog処理系を動かそうと苦心していたことを
思い出しました。1982年に連載されたものはバックナンバーが入手できず
残念だったのですが、何年か前に知人のご厚意によりコピーをいただくことが
できました。
752デフォルトの名無しさん:2008/12/23(火) 11:16:18
あー。
あのシリーズを個人で購読した人いるんだ凄いなー。
(神保町の古本屋でセットで買った)。

ハードカバーがカーキ色と青色があるのは、第一刷と第二刷だったのか。
753デフォルトの名無しさん:2008/12/24(水) 17:40:49
>>746
X 人
  X 死ぬ

ソクラテス 人
アリストテレス 人

の方がよくないか?
754デフォルトの名無しさん:2008/12/24(水) 17:44:17
まちがえた
X 人
  X 死ぬ

  ソクラテス 人
  アリストテレス 人

だった。ホーン節が生きないか。
755デフォルトの名無しさん:2008/12/24(水) 17:50:26
COBOLのようだw
756デフォルトの名無しさん:2008/12/24(水) 17:58:18
それと引数が20以上にもなると辛いこととなる。
好ましくないとはいっても、ビジネスでは時々ある。
757デフォルトの名無しさん:2008/12/24(水) 20:45:33
>>756
それがフラット構造のよさですよ。
758デフォルトの名無しさん:2008/12/25(木) 03:31:33
ソクラテスの問題、とりあえずSchemeでやってみたら出来た
http://codepad.org/bYb3nxL7

合掌
759デフォルトの名無しさん:2008/12/25(木) 07:07:08
  [] X X append

X Y Z append
  [U|X] Y [U|Z] append

やはりこれが究極のProlog仕様か。
760デフォルトの名無しさん:2008/12/26(金) 17:51:29
>>759
ウラジオストックから日本海を眺めてるようだ。
761デフォルトの名無しさん:2008/12/26(金) 23:33:10
>>759
Schemeで簡単にできた。究極のProlog仕様?

(appende `(い ろ) `(は に) r)
=> (((い ろ) (は に) (い ろ は に)))

(appende a b `(い ろ は に))
=> ((() (い ろ は に) (い ろ は に)) ((い) (ろ は に) (い ろ は に)) ((い ろ) (は に) (い ろ は に)) ((い ろ は) (に) (い ろ は に)) ((い ろ は に) () (い ろ は に)))

http://codepad.org/1lbqvsBH
762デフォルトの名無しさん:2008/12/27(土) 19:04:11
デフォルトで並列処理を行うProlog処理系ある?
763デフォルトの名無しさん:2008/12/27(土) 23:40:50
Parlog
http://www.parlog.com/en/parlog.html

これって並列Prolog?
764デフォルトの名無しさん:2008/12/28(日) 20:37:55
>>762
KL1
765デフォルトの名無しさん:2008/12/29(月) 05:30:27
>>759
このくらいシンプルだとちょっと構文規則を変えれば、

 || _ _ .
__ ___ ____ .
 _____|__ ___ _____|____ .

Esotericな言語 Loran のできあがり。



766デフォルトの名無しさん:2008/12/29(月) 05:39:06
第一節まちがえた。これだと無名変数になってしまう。
 || __ __ .
__ ___ ____ .
 _____|__ ___ _____|____ .
767デフォルトの名無しさん:2008/12/29(月) 09:45:20
Epilogなんてのもあったな
啓学出版から訳本が出てた
768デフォルトの名無しさん:2008/12/29(月) 10:13:21
>>767
Epilogはバックトラックする仕様だった記憶がある。実際に動いているのを
見たことはないけれど。
Concurrent PrologやGHC/KL1はしない。上田和紀氏はずっとGHC上での
全解探索を研究テーマにしていた。
私は全然知らないのですが、Parlogはどうなんですか?

769デフォルトの名無しさん:2008/12/29(月) 12:49:23
そんな昔からGlasgow Haskell Compilerがあったのか・・・・
GHCはICFPの人気言語第一位!
770デフォルトの名無しさん:2008/12/29(月) 12:55:46
>>768 の GHC は Guarded Horn Clauses だろJK
771デフォルトの名無しさん:2008/12/29(月) 13:41:29
>>770
エジンバラ大だったらにICOTに敬意を表してGHCなどという名前、付けないよね。
そうか、EHCにしかならないかw
グラスゴー大とエジンバラ大はやはりライバル関係にあるの?
772デフォルトの名無しさん:2008/12/30(火) 08:15:12
>>771 1987年頃にはPC98で動く逐次型GHCが商品になっていた。