PrologでまったりPart 2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG過去スレ
Prolog でまったり
http://pc5.2ch.net/test/read.cgi/tech/976462999/
リンク集
http://www.summa.jp/lang/logic/prolog.htm
http://bach.istc.kobe-u.ac.jp/prolog/
チュートリアル
http://www.amzi.com/AdventureInProlog/
http://computing.unn.ac.uk/staff/cgpb4/prologbook/
http://www.intranet.csupomona.edu/~jrfisher/www/prolog_tutorial/pt_framer.html
http://bach.istc.kobe-u.ac.jp/prolog/intro/
http://www.geocities.jp/m_hiroi/prolog/
http://www.asahi-net.or.jp/~JF1T-YSD/prologV2/
0232デフォルトの名無しさん
2005/07/08(金) 07:16:46くらいは覚悟しなくてはならないので、グローバルスタックの初期sizeが
問題になりますね。
0233デフォルトの名無しさん
2005/07/08(金) 20:20:30ありがとうございます。
Cで考えると
Local Stack: ローカル変数領域
Control Stack: returnアドレス領域
でしょうか。
structure内部の変数をGlobal Stackとして特別扱いするのは不思議ですね。
またGlobal/Local StackがあればTrail Stackは要らなさそうにも見えますが…。
0234デフォルトの名無しさん
2005/07/16(土) 13:43:520235デフォルトの名無しさん
2005/07/18(月) 00:25:05何故ファイルに書かなきゃいけないようなヘンテコな言語仕様にしたんだろう
0236デフォルトの名無しさん
2005/07/18(月) 17:22:10どんなイメージですか。
assert/1で定義する仕様が使い難いというのは解ります。
私はProlog-KABAがEmacs風エディタを持っていたことから、それを拡張して、
エディタ内で動作するインタプリタを現在でも使っています。
従ってMarkから定義節末までをctrl-x ctrl-sで再定義する的な利用法に
なります。事務処理でPrologを使う場合の課題は対話的にというよりも
例えば「出荷場所、出荷日をキーに日報を作成する」という仕様書から
いかに自動的に、
日報(_出荷場所,_出荷日)
:-
を導くかと言うことにあります。形態素解析などにより、必要な語彙を
抜き取って自動で論理変数の字面を作ったりします。その後、
定義節として組み立て直すのですが、このような手順を踏む以上、エディタを
駆使してという利用法以外、私には考えられません。
0237デフォルトの名無しさん
2005/07/18(月) 19:41:37・x(y,z).での定義とx(y,z).での質問が同じ形式なのは解せない
・「変数は大文字から―」は読みにくさ・使いにくさを助長している
とかそういうレベルだよ
インタラクティブってのは、所謂シェルみたいなのが欲しいってことさ
ちょっとイメージがまとまらないさヽ(´ー`)ノスマン
0238デフォルトの名無しさん
2005/07/18(月) 22:49:34終始しているといえます。手続き的な要素は
member/2とfindall/3,repeat/0,for/3とfail,true,not/1,でほとんど
構成され、append/3,reverse/2,sort/2のような述語でさえ、めったに
使うことはありません。代表的なパターンは
1・・データベース述語の参照からfailに至るバックトラックパターン
2・・findallで一旦データベース述語をリストに構成して再帰述語に
渡すパターン(データベースではなくstreamであることもあります)
3・・memberでリストの要素を取り出し、failでバックトラックするパターン
この3パターンの組み合わせだけでほとんどの述語(質問)は構成されます。
もちろんC言語などと同様文字列述語なども頻繁に使用されますが、
上記のパターンの中にフィルターとして現れるということになります。
0239デフォルトの名無しさん
2005/07/18(月) 23:00:31私は変数をすべてアンダースコア+漢字変数名で表現しているので
見やすさのレベルはご指摘のケースとは異なります。それでも、
プログラムエラーの90%以上がアンダースコアの付け忘れによって
起こっています。
0240デフォルトの名無しさん
2005/07/19(火) 09:58:22現在では#クラス名などに使われることが多く、#はもう使えませんね。
というか、使わなかったのが幸いでした。
0241デフォルトの名無しさん
2005/07/19(火) 11:09:280242デフォルトの名無しさん
2005/07/19(火) 20:07:32ただし、PSIで機械語レベルからPrologによってOSを書いた時のことだが
OSのコードはほとんどが「前向きで」バックトラックを必要とする
部分はごく少ない。つまり、テーブルの参照的な部分は少ないと
いうことだろう。とすると、いちいちバックトラック時の「備え」を
するPrologはいかにも効率が悪い。そういう話もあった。
LispをPrologで書く場合も同じことが言えるのではないか。Lispを
書く場合にどれだけバックトラックが必要になるか。そんな視点で
この問題は見ればよいのではないか。
0243デフォルトの名無しさん
2005/07/20(水) 18:37:09キター!!!
0244デフォルトの名無しさん
2005/07/23(土) 18:52:19沖のPIM-Dって使った事ありますか?
0245デフォルトの名無しさん
2005/07/23(土) 21:19:49PSI : Prolog WSの名前
OS : SIMPOS
として、機械語レベルのPrologの名前は何ですか?
0246デフォルトの名無しさん
2005/07/23(土) 22:08:550247デフォルトの名無しさん
2005/07/23(土) 22:49:22水平型マイクロコード剥き出しみたいなヤツだったような。
0248デフォルトの名無しさん
2005/07/23(土) 22:51:320249デフォルトの名無しさん
2005/08/12(金) 18:10:10皆さんが何を使っているか教えてください。
私はというと、インタプリタのトップから質問を入れています。
0250デフォルトの名無しさん
2005/08/17(水) 20:05:58Rubyで書いたCGI
0251デフォルトの名無しさん
2005/08/17(水) 23:11:27私はtelnet制御にこだわっているので、
PrologWebServerを立ち上げておいて、telnet上の
Prologインタプリタからw3mやmozillaを起動して、
入力データだけ蒐集させて、それをサーバーに送り
それをさらに同期をとって元のインタプリタが受け取ると
いうインタフェイスも作って使っていました。
ただ、オペレーション速度で、単純な負節呼び出しに
勝てないので現在は使っていません。
PrologWebServerは外部とのインタフェイスとして使われて
おり、そこで使うhtmlファイルが一部書き換え(実行時に行う)だけで
全て流用できるのでその点では便利ですね。
0252デフォルトの名無しさん
2005/08/25(木) 17:10:17されているとのこと。
どなたか、試された方はおられますか?
0253デフォルトの名無しさん
2005/08/25(木) 17:25:02>Prologのプログラミングというのは、基本的に
>データベースの参照に終始しているといえます。
鋭いご指摘。これはVBでもJavaでもC++でも
同じです。GUIや通信など余計なものを取り外し、
本質的にまとめるとこうなるのでしょうね。
特に
>>
1・・データベース述語の参照からfailに至るバックトラックパターン
2・・findallで一旦データベース述語をリストに構成して再帰述語に
渡すパターン(データベースではなくstreamであることもあります)
3・・memberでリストの要素を取り出し、failでバックトラックするパターン
<<
論理構造の操作であれば、これで十分なんでしょうか。
0254デフォルトの名無しさん
2005/08/26(金) 13:34:28そのレスはPrologの動作原理のことを書いてあると思うんだけど、
なにか誤解してない?
Prologのプログラムはルールと事実と問い合わせで構成されているから、
それ自体がデータベースとみなすことができるわけだけど、
VBやJavaやC++が参照するところの「データベース」ってプログラム自体を
指すわけじゃないでしょ。
0255デフォルトの名無しさん
2005/08/27(土) 08:39:14Prologがデータベースの参照に終始していると言うのは
質問または副目標の実行が全て定義節の頭部との
ユニフィケーションという単一の動作原理に導かれている
から。
プログラムを書くとき、読むとき、そこだけを押さえて
いればよい。
>>253 は、どんな言語でも本質はプログラマが与えた
情報(データベース)を引き出すことにある、という
ことを言っているのだと思う。興味深い指摘だが、
>>238で書いたことと若干ニュアンスが異なる。
0256デフォルトの名無しさん
2005/08/27(土) 08:51:53ただ、私の場合OracleやPostgresqlのデータベースを
最近全て、Prologの定義述語に変換した。その心は
Prologとはデータベースである、ということを
完全に実現したかったから。そういう意味では>>253の
見解の方に近いのかもしれない。
0257デフォルトの名無しさん
2005/08/27(土) 20:58:26もって、例えばRDBからSQLでデータをプログラムに
取り込んで利用するのか、確かに実装上は大きな
差異です。
しかしデータから付加価値を生み出すという
プログラムの本質部分に注目すれば
まあそれは若干直接操作して利便性が高くなるのか
ワンクッションSQLを介するのかの差異であり
あまり大きな問題ではないと考える訳です。
RDBのデータとオブジェクト構造をORマッッピンしなくては
いけないか、それともODBから直接オブジェクト構造化された
ものを利用するのかの差異と同じようなものだと。
ここで問題にしたいのは、ロジックの側です。
具体的な問題領域特有のロジック構造以外は、
ある汎用的な操作でデータ処理が可能なんでしょうか?
>>
1・・データベース述語の参照からfailに至るバックトラックパターン
2・・findallで一旦データベース述語をリストに構成して再帰述語に
渡すパターン(データベースではなくstreamであることもあります)
3・・memberでリストの要素を取り出し、failでバックトラックするパターン
>>
勿論全てをこれでカバー出来るとは思いませんが
問題の70〜80%程度はこのパターンの中に納まる
のでしょうかとお伺いしている次第です。
0258デフォルトの名無しさん
2005/08/28(日) 22:20:43Prologでプログラムが組めるようになれば、
その質問の答えは自ずから理解できる。
ここで聞くだけ聞いて済まそうというというつもりなら
答えだけ聞いても「ふーん、そんなもんか」で終わり、
結局自分の身にならない。
0259デフォルトの名無しさん
2005/08/28(日) 22:24:270260デフォルトの名無しさん
2005/08/29(月) 16:18:10> Prologでプログラムが組めるようになれば、
> その質問の答えは自ずから理解できる。
>
> ここで聞くだけ聞いて済まそうというというつもりなら
> 答えだけ聞いても「ふーん、そんなもんか」で終わり、
> 結局自分の身にならない。
随分敷居が高いんですねぇ。
伝統的にム板においては、文句は言うが
聞かれた質問には応えていた。
コードなんか、ブツブツ言いながらも山のように
質問者のために書いてやっていた。
時代が変わったのか?
それとも、
ム板BLの方針が変わったのか?
それとも
質問に応える知識とコードを書く技術自体が
衰退してしまったのか?
ー>関数型言語スレも
0261238 255
2005/08/29(月) 16:59:58あります。どこから書いたらいいか。
Prologはパターン数の少ない言語でその点からもっと
注目を浴びていいと思うのだが、この問題に言及した
啓蒙書がない。Prologブームが下火になった頃に
プログラムパターンが注目されだしたということでしょう。
今回私が示した3つのパターンはデータベースから情報を
引き出し、何らかの働きかけがあって出力する。そこまでの
殻の部分、スクリプト的な部分ですね。2はちょっと性格が
異なりますが、初心者にはこれを教えてあげないと、
集約問題でPrologが嫌になります。findallの第二引数
つまり蒐集項の中にmember/2が現れる、そういうコードは
意外と多いものです。
この外殻パターンは比較的簡単に「空気化」します。
やはり、再帰パターンが「空気」となるかどうかが
Prologプログラマとしての正念場でしょうか。
0262デフォルトの名無しさん
2005/08/30(火) 10:26:04カバーできるのかという問題は、バックトラックを
含むロジックでは95%以上でしょう。後でよくよく見ると
全部これだったと言う感じです。
Prologの述語にはバックトラックしない述語もありますから
連言が恒に真になるような述語ですね。それから再帰述語。
これらがどのくらいの比率になるかはプログラマの個人差
が大きいと思います。30%くらいで、3パターンの方が
70%というのはいい線いっているかも知れません。
再帰述語は本当にパターン化していて、ほとんど切りません。
読み飛ばし、打ち切り、コピー、変換。他に経路問題(祖先)的なリンク。
その時に、情報を引数として与えるか、リストの中で十分なのか。
それだけですね。
オリジナルなコードというのはほとんど切る余地がありません。
スケジュール問題などはこれら全てのパターンが二重三重に出てきて
ちょっとスリリングですが。
0263デフォルトの名無しさん
2005/08/30(火) 10:44:26repeat.
repeat :- repeat.
だけをテーマにした講習会を開いたことがあります。
上記の述語から出発して、引数を与えていくと何が
起こるかということを正味5時間講義しました。
定義述語から再帰述語だけで、データを収集することが
なぜ不可能かを完全に理解させるなどといった隠された狙いの
ある画期的な講座のつもりだったのですが、初心者には
むずかし過ぎて不評でした。
0264デフォルトの名無しさん
2005/08/30(火) 17:14:01丁寧な解説有難う御座いました。
>Prologはパターン数の少ない言語でその点からもっと
>注目を浴びていいと思うのだが、
言語仕様そのものに論理ロジックを組みこんだ言語
(一般言語よりメタ言語)ですから、そのロジックを
取り込んでいる比率に応じてパターン数は
減るはずであり、つまり、少ないパターンで
問題領域がカバーできる、ということですね。
>3パターンの方が70%というのはいい線いっているかも知れません。
素人的な表現で申し訳ありませんが、メタ化された言語で
さらにメタ化を実現して絞りに絞ったパターンとしては
一体何が残るのだろう、と興味を持った次第です。
0265デフォルトの名無しさん
2005/08/30(火) 17:14:52>やはり、再帰パターンが「空気」となるかどうかが
>Prologプログラマとしての正念場でしょうか。
この辺りは関数型言語と近いですよね。
自己遡及的な再帰パターンが身体化するかどうか。
コンパイラベースの実装は繰り返しでも、関数スタックを
使用しなくても、それが高速であれば問題ないと思う訳です。
プログラマにとって問題を再帰構造で写像できるかどうか
これが重要だと。
>定義述語から再帰述語だけで、データを収集することが
>なぜ不可能かを完全に理解させるなどといった隠された狙いの
>ある画期的な講座のつもりだった
これはデータ収集においても、ドメイン・スペシフィックな
アルゴリズムが不可欠であると言う意味でしょうか?
0266デフォルトの名無しさん
2005/08/31(水) 18:18:04からくり人形水準の話です。
Prologはバックトラックを制御に組み込みました。しかし
バックトラックが働くのは論理的に偽なった時で、一方、
再帰述語は真になった時のみ意味を持ちます。
非決定性の述語として定義されるデータベース、たとえば
身長(彩,160).
身長(未来,165).
身長(あゆ,157).
から[[彩,160],[未来,165],[あゆ,157]]というリストを
得たいとします。
このデータを収集するのに再帰的述語で一旦真になり、
得た[彩,160]をfailしてしかもリストに保持することは
不可能です。しかし、ここが初心者にとっては解りにくいのです。
それで、再帰的述語でありながら、バックトラックして
その機能を発揮する特異な述語repeatを出発点として
それに定義節を挿入したり、引数を与えたりしながら
何とか上記のリストを得ようと努力させます。これは
当然徒労に終わるのですが、この問題に苦闘することで、
なぜ、不可能なのかを一気に理解させようという試みでした。
残念ながら当時のテキストを読み返すとこのような企みが
あったとは思えない踏み込み不足の講義だったようです。
でも着眼としては面白いと思うのでそのうち機会があったら
やり直してみたいですね。
0267デフォルトの名無しさん
2005/09/01(木) 18:54:32>データベース、たとえば
>身長(彩,160).
>身長(未来,165).
>身長(あゆ,157).
>から[[彩,160],[未来,165],[あゆ,157]]というリストを
>得たいとします。
…
>不可能です。しかし、ここが初心者にとっては解りにくいのです。
申し訳ありません。何故こんなことが不可能なのか?
さっぱりワカリマセン。
普通のハッシュテーブルに見えるが…
Prologを勉強して改めて出直します。
0268デフォルトの名無しさん
2005/09/02(金) 07:45:42ここではストリームとは順序付けされた情報の列でシステムが
これをカウンターを保持しているように管理して、次々と
情報を渡してくれるようなものとします。
get_data([A|R])
:-
read(A),not(A=end_of_file),get_data(R).
get_data([]).
型の再帰述語でリストに収集することが可能なことは
おわかりでしょう。それでは、
get_data([[X,Y]|R])
:-
身長(X,Y),get_data(R).
get_data([]).
ではどうか。これだとX,Yには最初の彩と160がバインドされ続けて
停止することができず、多分スタックオーバーフローが起きます。
ここまではおわかりになりますか?
0269デフォルトの名無しさん
2005/09/02(金) 08:44:18例えば計算機(1+2*3とか)作れる?
0270デフォルトの名無しさん
2005/09/02(金) 09:45:51AdobePhotoshopをPrologで書き直すこと(たとえば)。
何百万回の演算を相当数繰り返すような操作は苦手。
0271デフォルトの名無しさん
2005/09/02(金) 10:01:08計算機(_式,_答え) :- _答え is _式.
実行例
?- 計算機(1+2*3,X).
X=7
yes
?-
これでも計算機として十分だと思いますが、おっしゃられていることは
文字列 "1+2*3" を解析して
1 + ( 2 * 3) = 6 を導けるかという意味なのでしょうね。
結論から言うと(プログラムは間に合いませんが)、こういった
文字列の解析はPrologの最も得意とするところと言えるでしょう。
0272デフォルトの名無しさん
2005/09/02(金) 17:30:07申し訳ない。
>データベース、たとえば
>身長(彩,160).
>身長(未来,165).
>身長(あゆ,157).
と書かれてあると条件反射的に、身長という
Columnに(彩,160)(未来,165)(あゆ,157)という
ハッシュテーブルが格納されているイメージしか
浮かびません。
どちらにしてもprologの基礎からやらないと…
>この問題に苦闘することで、
>なぜ、不可能なのか
ただ、この部分は面白い。
目的が方法論的に実現不能であるということを、言わば
ゴール自体が偽であることを、証明する作業になる訳ですよね?
つまりバックトラックして真であることを証明すると
ゴールが偽であることが判明する訳です。
で、もしそれが、バックトラックして偽であることを
「発見」すれば、逆に画期的なことになります。
ここからは、単なる個人的な想像ですが、本来prologは
そのような使い方が合っているのではないでしょうか。
不可能なゴールを設定して、それを証明する過程で、逆に
偽であることを「発見するのに」適しているのでは
ないでしょうか。
例えば第5世代コンピュータ開発時代に「それを作る」
という前向き推論ではなく、「それは不可能だ」という
ゴールを設定したらどうだったんでしょうね。
そのゴールから後向きに推論を重ねることで
逆に「その綻び」を発見する訳です。
0273デフォルトの名無しさん
2005/09/02(金) 18:32:39集める人は系の外側に居ないといけない。
0274デフォルトの名無しさん
2005/09/03(土) 02:15:22>データベース、たとえば
>身長(彩,160).
>身長(未来,165).
>身長(あゆ,157).
>から[[彩,160],[未来,165],[あゆ,157]]というリストを
>得たいとします。
…
>不可能です。しかし、ここが初心者にとっては解りにくいのです。
リストを得ることは、
findall([A,B], 身長(A,B), X).
で、可能なんだが。
C = [[彩,160],[未来,165],[あゆ,157]]
0275デフォルトの名無しさん
2005/09/03(土) 02:21:44訂正
C = [[彩,160],[未来,165],[あゆ,157]]
↓
X = [[彩,160],[未来,165],[あゆ,157]]
0276デフォルトの名無しさん
2005/09/03(土) 04:55:300277デフォルトの名無しさん
2005/09/03(土) 11:07:42>findallの類を使わずにリストを得ることは不可能、という意味でしょ。
そうではなくて、
>272
>不可能なゴールを設定して、それを証明する過程で、逆に
>偽であることを「発見するのに」適しているのでは
>ないでしょうか。
でないと、単に初心者に不可能なことをやらせて
「ほうら!出来なかっただろう。」って…
0278デフォルトの名無しさん
2005/09/03(土) 13:05:55この話は>>238あたりに源があって延々と続いています。
findall/3については>>261で指摘いただいたことにもちょっとだけ
触れました。私は事務計算用にPrologを使っているのでfindall/3なしには
暮らせません。
ここでの話のポイントは再帰述語から単位節で定義された述語の
引数データを収集することが「不可能」であるということです。
私がPrologを学び始めた20年ちょっと前、古川康一、黒川利明、高木茂行、
中島秀之、溝口文雄氏といった錚々たる方々からPrologの手ほどきを
受けました。私の記憶ではこの問題に触れてそれが不可能な事なのだ
と言う説明をされた講師の方はいらっしゃらなかったように思います。
私はこの問題に結構悩みましたので、早めにはっきりさせておいた
方がいいと思っていたわけです。
0279デフォルトの名無しさん
2005/09/03(土) 15:59:21あなたの問題意識がよく分かってないのですが、例えば
height(aya,160).
height(mirai,165).
height(ayu,157).
p([X,Y]) :- height(X,Y).
q([X]) :- p(X).
q([X|Xs]) :- q(Xs), p(X), not(member(X,Xs)).
r(Xs) :- p(X), not(member(X,Xs)).
s(Xs) :- q(Xs), not(r(Xs)).
?- s(X).
X = [[ayu, 157], [mirai, 165], [aya, 160]]
という方法は「再帰述語から単位節で定義された述語の引数データを収集する」
というruleに反するのでしょうか?
> 私がPrologを学び始めた20年ちょっと前、古川康一、黒川利明、高木茂行、
> 中島秀之、溝口文雄氏といった錚々たる方々からPrologの手ほどきを
> 受けました。
確かに凄い。羨ましいです。当時はどういう話題がprologの最先端だったのでしょうか?
0280デフォルトの名無しさん
2005/09/03(土) 16:25:13その方法は可能ですね。
定義節がRDBであり、集合であるとするならばそれで良いと思います。
述語定義の場合は重複を妨げる約束がないとするのが
一般的な述語の解釈ですので、完全なものは難しいのでは
ないでしょうか。
0281デフォルトの名無しさん
2005/09/03(土) 17:45:55いやぁ、深い意味はありません。
普通プログラム言語を教える時って
こんなことも出来る、あんなことも出来る
って、まずその有用性を吹聴するのが通例ですよね?
それを、初心者に不可能なことをいきなり体験させて
その言語の不能性を叩き込むって、いかにも
prologらしい。
実に「後向き」推論の効いたやり方だなぁ、って
感心しただけですから。
>私がPrologを学び始めた20年ちょっと前
これは当時からの伝統でしょうか?
0282デフォルトの名無しさん
2005/09/03(土) 19:16:29できるだけ進みたい。ですから、「前向き」でした。
append/3,sort/2,reverse/2と3,member/2、それに!くらいでもう
夕方になってしまいます。
今と違って再帰的な処理に慣れてなかったですね。私もLISPやPascalは
やっていたのですが、Prologの再帰は目の付け所が違っていて
面食らいました。
溝口先生の時は理科大の柏校舎で「エキスパートシステム」を
テーマにした泊まり込みのワークショップ的な講習会でした。40-50人は
集まりました。楽しかった。
それから、Prologの問題点や欠点に案外と触れられたのが田中穂積先生の
自然言語処理に関する講習会です。これは、田中先生が論理プログラミング
の研究者としてではなくユーザーとしてPrologを見ることのできる
立場だったからではないかと思います。
0283デフォルトの名無しさん
2005/09/04(日) 08:33:28ああ、そうやればよかったのか。上手いね。
0284デフォルトの名無しさん
2005/09/04(日) 10:31:38>Prologの問題点や欠点に案外と触れられたのが田中穂積先生…
どうもこの点が良く分からないんです。
当時は今と違って相当の数の人々がPrologを学習した
はずですよね。
官民挙げて取り組んだ第5世代コンピュータの旗艦言語
として、鳴り物入りで採用されたPrologが何故?
ここまで衰退してしまったのか。
1)ホストとパソコンという環境の差でしょうか?
2)GUIへの対応の遅れでしょうか?
3)それともPrologの言語仕様を
他の言語が取り込んじゃったとか?
0285デフォルトの名無しさん
2005/09/04(日) 15:42:130286デフォルトの名無しさん
2005/09/04(日) 19:09:43もっとも「前向き」な回答を一つ。
プログラマの水準が上がったということがあると思います。
そんな馬鹿なというなかれ。現在では、
たとえば、C++のプログラマで
Prologくらいの機能ならば「必要ならばいつでも書ける」と
思っているプログラマは結構多いのではないでしょうか。
20年前だとNearlyZeroですね。この差は大きい。
そこまでの自信があれば、Prologに特化しておく必要は
ないですね。
0287デフォルトの名無しさん
2005/09/05(月) 13:13:32ここ十年に限っていえばWindows向きの作りに
なっていないということでしょうね。
WindowsマシンのデスクトップにTeraTermが
標準で載っていれば少しは違ったかも知れません。
0288デフォルトの名無しさん
2005/09/05(月) 18:59:41どうなんでしょう?
ある面、能力的に低下している部分は
ないのでしょうか?
つまり、ロジックにおける細密さです。
GUIやDB操作、WEB系の技術にかまけて
情報そのものの付加価値再構成にうとく
なっていることはないんでしょうか?
表象系(REPRESENTATION)にしか目が
向かない、地味なロジック系がないが
しろになっているようなことは?
> 私がPrologを学び始めた20年ちょっと前、古川康一、黒川利明、高木茂行、
> 中島秀之、溝口文雄氏といった錚々たる方々からPrologの手ほどきを
> 受けました。
我々の世代は、既に先生達の世代を凌駕しちゃったんでしょうかねぇ?
その論理性において、その思想性において。
0289デフォルトの名無しさん
2005/09/05(月) 19:58:21C++でユニフィケーションがいつでも書けることと
論理プログラミングに精通しているとは関係が
ありませんね。Prologを5年も粘っていれば
誰でも論理式が日常的なものになりますが、
どんなに優秀なC++のプログラマでも論理式は
別物です。
データモデルの構築などという領域では
C++やRuby、Pythonといった言語のプログラマには
想像もつかない奥行きがPrologにはあります。
安定したレベルでの環境に身を置かないとわからない
こともあるのでそういう意味で>>286は不完全で
一方的な見解ということになるでしょう。
0290デフォルトの名無しさん
2005/09/05(月) 20:53:14職人肌だが視野の狭い経験主義者の>289
の間で交わされる会話の空虚さが実に面白い。
0291289
2005/09/05(月) 21:23:34身長(彩,160).
身長(未来,165).
身長(あゆ,157).
の代わりに、
身長([[彩,160],[未来,165],[あゆ,157]]).
と定義すると、じんま疹がでるという感覚は
わからないだろうなー。
0292デフォルトの名無しさん
2005/09/06(火) 06:57:180293これがprologです
2005/09/06(火) 07:15:13Prologのプログラムの読み方、検証について述べます。
Prologのプログラムはまず副目標が合って、それに対応する
述語の定義節を調べることになりますが、その時、
関数、引数を上から「引っ掻くように」読みます。この引っ掻く
感覚は、短距離走で膝から下を前に振り出しそれを引き戻して
地面を引っ掻く感覚に近いものです。考える隙はありません。
走るときはこの後、脚が体の下で自転車をこぐように回転する
ように動きますが、Prologでは連接する副目標に戻り
次の定義節を「引っ掻きます」。これがぐるぐる回る感覚に
なります。
この感覚で進むには
身長([[彩,160],[未来,156],[あゆ,157]]).
の定義記法では絶対にだめなのです。
これがPrologです。
0294デフォルトの名無しさん
2005/09/06(火) 20:17:120295デフォルトの名無しさん
2005/09/07(水) 10:18:17「経験主義者」というレッテル貼られたから皮肉で返しているだけだろ。
ただでさえ少ない住人を更に減らすようなレスはどうかと思うぞ。
0296デフォルトの名無しさん
2005/09/07(水) 15:39:120297デフォルトの名無しさん
2005/09/07(水) 16:52:58というものがあるだろう。私の場合は、構造の浅い、平板な
Prologのデータベースを縦方向に走査するとき、それを
感じる。Prologが縦方向に一気に一瞥できるデータ表記法に
なっていることはバックトラックアルゴリズムと無関係では
ないが、そのような理屈よりは、「Prologならでは」の感覚が
どこにあるかを述べたかった。
横方向でなく縦方向だと強調しているのは、Prolog以外に
データベースの構築をこの方向に表記できる言語を少なくとも
私は知らないからだ。現在主流の言語がPrologを乗り越えたのか
という話からいえいえPrologには独自の領域がありますよという
流れになっている。
これは結構「経験主義的」説明だと思うけど。
0298デフォルトの名無しさん
2005/09/07(水) 18:32:21自分の経験を度外れに拡大して「Prologとは〜」と一般論にしたり、
それに基づいて他の言語を批判したりしなければ。
0299デフォルトの名無しさん
2005/09/08(木) 00:08:14一度ぐぐってみる程度の知恵はないのかねぇ
0300デフォルトの名無しさん
2005/09/08(木) 08:54:38このスレはPart 2の前後からだから新参者ですが
日常、Prologを使い続けてる人の話をできるだけ
多く聞きたいね。
0301デフォルトの名無しさん
2005/09/08(木) 11:04:55何か読み違いをしていませんか。他の言語批判なんて
全然していませんよ。
0302デフォルトの名無しさん
2005/09/08(木) 18:33:17> 自分の経験を度外れに拡大して「Prologとは〜」と一般論にしたり、
こっちは否定しないんだw
0303デフォルトの名無しさん
2005/09/08(木) 18:43:24都合の良いところだけ取り上げて反論するのは議論の基本だろ.
隙を見せた>>298が悪い.
関係ないがpart 1も熱かったよな…
0304名無しさん@そうだ選挙に行こう
2005/09/10(土) 16:52:51>身長(彩,160).
>身長(未来,165).
>身長(あゆ,157).
>の代わりに、
>身長([[彩,160],[未来,165],[あゆ,157]]).
>と定義すると、じんま疹がでるという感覚は
>わからないだろうなー。
身長に対して、個別にデータを代入するんじゃなくて
一気に初期化したと考えたらどう?
0305名無しさん@そうだ選挙に行こう
2005/09/10(土) 21:36:56自分でprologインタプリタを書くことはできますか?
参考資料があれば教えてください。
0306名無しさん@そうだ選挙に行こう
2005/09/10(土) 23:13:03http://www.vanx.org/archive/wam/wambook.pdf
0307デフォルトの名無しさん
2005/09/11(日) 00:49:22Prologの定義は超時間的?なものだからその解釈は自然ですね。
ただ、この話では、
・ 外延的な表記
・ 他の言語のデータベース定義がテーブルや配列等、右方向に
伸びる形式で表記されることが多い。
の二点を強調したかった。うまく説明できそうになかったので
じんま疹で誤魔化したらすぐに批判が来た。
リスト形式で格納する案は
?- ・・・,身長(L),( member([A,B],L),foo(A,B),・・・
でfooに論理的な解釈が来る。もちろん、
?- ・・・,身長(L),foo(L,Y), ・・・の場合もある。
Lを読む気はなく、fooでデータベースの解釈を述べる定義となる。
それに対し、ここで外延的な表記と言ったのはこれ以上ルールとして
述べられない原初的な情報。それを強調したコードを書きたい。
(ちょっと長くなるから一旦切る)
0308デフォルトの名無しさん
2005/09/11(日) 01:38:25親子(為義,義朝).
親子(義朝,頼朝).
先祖(A,B) :- 親子(A,B),!.
先祖(A,B) :- 親子(A,C),先祖(C,B).
原初的情報とは、親子、為義、義朝、頼朝、であり、
これを、
親子([[為義,義朝],[義朝,頼朝]]).
と定義しても、先祖の定義の変更すれば良いのだが、
プログラマとしては絶対に受け入れられないくらいの意味です。
0309デフォルトの名無しさん
2005/09/11(日) 02:09:32SWI-Prologのソース読んでみるというのもある。ただし、ヒントに
なりすぎるかも。
ハイスペックのマシンでは、PrologでPrologインタプリタを書く
つまり、デバッガーで動かすのは当たり前だから、最初にこれの
しっかりしたものを作ってからにするとよい。
0310名無しさん@そうだ選挙に行こう
2005/09/11(日) 07:57:33http://hp.vector.co.jp/authors/VA000672/#sprolog
最初に書くときはGCを面倒みてくれる言語を使った方がいいと思う。
0311名無しさん@そうだ選挙に行こう
2005/09/11(日) 12:07:01> ?- ・・・,身長(L),( member([A,B],L),foo(A,B),・・・
これが嫌なら、
身長(Who, Value) :- 身長(Data), member([Who, Value], Data).
みたいなのも定義するとか。
0312デフォルトの名無しさん
2005/09/11(日) 16:30:55効率の悪い>>279になる。一方、リストに保持すれば、
>>311でいけるからこちらの方が一般的といえるかも
しれない。じっさい、データベースがORACLE等の外部の
場合、
?- select * into L from 身長,( member([WHO,VALUE],L),・・・
のようなコードとなるだろう。この時、RDBSでの定義は>>307的に
いうなら、外延的な表記以外の何者でもない。
このように考えると確かに>>307->>308の外延重視の根拠が
疑わしくなってくる。
データモデルを構築する際にわざわざ
身長([[彩,160],[未来,156],[あゆ,157]]).
と定義して、>>311で取り出す手法を使う
Prologプログラマがどれだけいるかは疑問ではあるが。
0313デフォルトの名無しさん
2005/09/12(月) 08:09:36抑える findnsols があるんだが、他の Prolog にもあるのかな?
普通の findall だと、解のリストが多過ぎる場合に、困るんだが。
findall(Template, Generator, List)
findnsols(N, Template, Generator, List)
0314デフォルトの名無しさん
2005/09/13(火) 16:51:20全然関係ない話ですが、無償のPrologの処理系って
基本的に日本語は通りませんよね?
0315デフォルトの名無しさん
2005/09/13(火) 18:20:20?- '身長'([['彩',160],['未来',156],['あゆ',157]]). は○
?- 身長([[彩,160],[未来,156],[あゆ,157]]). は×
?- '身長'(_氏名,_値). これも× (_氏名,_値は変数)
だったと思います。書き換えて使っているので正確には思い出せない。
SWI-Prologで日本語を完全にに使うためにはpl-ctype.cファイル内の
文字型テーブル書き換え後再コンパイルが必要です。
0316デフォルトの名無しさん
2005/09/15(木) 17:40:22SWIの5.5はUNICODE対応らしいが、どなたか使った方は
ありませんか?
0317315
2005/09/16(金) 06:44:38できるだけ早く、5.5試してみます。
私はEUCなのですが。
0318デフォルトの名無しさん
2005/09/18(日) 04:58:31> ?- '身長'(_氏名,_値). これも× (_氏名,_値は変数)
は○ですね。
0319デフォルトの名無しさん
2005/09/23(金) 15:04:55UTF-8 でも同じですね。5.5.31ではEUCとUTF-8の
差はないようです。5.5.4でさらに変わるのかも知れない。
pl-utf8.c というファイルがあります。
pl-file.cも内容が変わっていますが、この中で
'を外すことはできそうです。
0320デフォルトの名無しさん
2005/10/03(月) 21:49:01prologのsource fileを読み込む処理を書こうとしているのですが、
consultを使うと、ファイルの中身が変な場合でも成功してしまい、
チェックすることができません。
なにか良い方法はないでしょうか?
0321デフォルトの名無しさん
2005/10/06(木) 12:45:34ERROR:表示とソースの位置(行数)が表示されますが、
エラー箇所で止まることを望まれますか。
0322デフォルトの名無しさん
2005/10/06(木) 13:24:38述語は
以前出てきたPrologサーバーでの共用Prologデータベース側で
実行されることを宣言するものです。
サーバーの参照は基本的に、
?- ..,node1 :: 身長(彩,X), ...
のようにサーバー名をつけて、すなわち
述語 :: の第一引数にサーバー名、第二引数に質問を
置く形式になっています。これは参照の場合で、
子スレッドで実行される場合です。共用Prologデータベースの
追加、更新、削除は親スレッドで実行される必要があり、
?- ...,node1 :: xxx(assertz(身長(豊,169))), ...
のような形式にしたい。ここでは仮にxxxになっていますが、
xxx に 相応しい述語名を付けてください。
0323デフォルトの名無しさん
2005/10/06(木) 18:49:18たしかにconsultは常に成功するみたいだね.変な仕様だ.
対策としては,file末尾に特定の述語を置くようにしておき,それが定義されてるかどうかで
読み込みの成否を判定するというのはどうだろう.
0324デフォルトの名無しさん
2005/10/07(金) 16:38:47意味的には、node1 のコンテキストでの call/1 ということになりますか?
だとすると call で始まる名前がいいのではないでしょうか。
call_with_remote_context とか?(Schemeっぽいけど)
0325デフォルトの名無しさん
2005/10/07(金) 18:33:09swi-prologには例外みたいなものがなかったっけ?
consultで例外が投げられていたりしない?
0326デフォルトの名無しさん
2005/11/07(月) 10:56:250327デフォルトの名無しさん
2005/11/08(火) 10:57:11どうかわからん、っていってました。
Prologはどんな特徴がある言語ですか。
それから、どうすれば入手できますか。
Swi-Prologというサイトは直ぐ見つかりましたが
これは代表的なものなのですか。
0328デフォルトの名無しさん
2005/11/08(火) 19:43:430329デフォルトの名無しさん
2005/11/08(火) 20:42:48言語の特徴、入手方法、SWI-Prologのどれも
このスレ(とくに前スレ)でくどいくらい出てきます。
0330デフォルトの名無しさん
2005/11/09(水) 22:29:130331329
2005/11/10(木) 11:25:56特徴だけ。
Prologは質問にシステムが答えてくれることの
連鎖でプログラムが進行していくように
見える(感じられる)言語です。
最小単位の質問で得られた答えを次の質問の
入力にして、質問して、その答えをまた・・・
という具合ですね。
実は他の言語でも似たようなものなのですが、
そのことがはっきり(くっきり)感じられることが
Prologの特徴であり、長所なのだと思います。
■ このスレッドは過去ログ倉庫に格納されています