[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 12/23 11:34 / Filesize : 227 KB / Number-of Response : 759
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Prologでまったり Part4



1 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:23:54 ]
過去スレ
Prologでまったり Part3
pc11.2ch.net/test/read.cgi/tech/1193354806/
PrologでまったりPart 2
pc11.2ch.net/test/read.cgi/tech/1102664221/
Prolog でまったり
pc5.2ch.net/test/read.cgi/tech/976462999/
リンク集
www.summa.jp/lang/logic/prolog.htm
bach.istc.kobe-u.ac.jp/prolog/

チュートリアル
www.amzi.com/AdventureInProlog/
computing.unn.ac.uk/staff/cgpb4/prologbook/
www.intranet.csupomona.edu/~jrfisher/www/prolog_tutorial/pt_framer.html
bach.istc.kobe-u.ac.jp/prolog/intro/
www.geocities.jp/m_hiroi/prolog/
www.asahi-net.or.jp/~JF1T-YSD/prologV2/

511 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 01:52:15 ]
世界の散文化はPrologでなされるのだろうか。

512 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 21:39:06 ]
OS X 10.5.8にもSICS Prologってインストール可能だろうか?

513 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 10:07:56 ]
本家サイトくらい読めよ。
www.sics.se/isl/sicstuswww/site/download4.html
www.sics.se/isl/sicstuswww/site/portability.html

514 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 10:28:45 ]
なんですか偉そうに。かわりに読んでください。

515 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 12:59:50 ]
どうしてそういう不安があるの

516 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:36:36 ]
Mac OS X は、普通の Unix 系の OS だから、他の Unix 系の OS で動くアプリケーションなら、動くよ。
動かないのは、デバイスドライバとかの特殊なソフトウェアじゃないかな。

ただ、Mac OS X 用のアプリケーションは、他の OS じゃ動かないよ。
Mac OS X の独自機能だけを使ってアプリケーションを作るのが通例だろうから。

517 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 21:38:28 ]
> Mac OS X は、普通の Unix 系の OS
machスレッドはpthreadとお約束が違うので
微妙に動かなくなったりするけどな


518 名前:デフォルトの名無しさん [2009/10/01(木) 20:27:12 ]
Prolog でやるエロゲー作ったら、みんな Prolog やるんじゃね?



俺は、エロゲーやらないけど

519 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 20:29:40 ]
>>518
lisp ベースのゲームエンジンがあって、それを使ったゲームは
そこそこ売れているんだけど、みんなlisp やんないよね




520 名前:デフォルトの名無しさん [2009/10/01(木) 20:39:50 ]
>>519
それは、エンジンが lisp なんであって、lisp でやるわけじゃないんじゃ?
目に見えないと分からないでしょ。

521 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 20:42:59 ]
Age of Empire の AI が Lisp ぽいという話はあったな

522 名前:デフォルトの名無しさん [2009/10/01(木) 21:27:19 ]
そういうチラ見せじゃなくて、
コマンドラインで Prolog 打ったら、
女の子が反応したり、
女の子に新しい何かを覚えさせたり
出来るのを考えてた

523 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 21:37:43 ]
俺が喜ぶポーズを取ってみろ!

と指令を出すと、登録してある嗜好データベースで演繹して
そのシチュエーションでプレーヤーが一番喜ぶポーズを取る萌えキャラ。


524 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 03:51:46 ]
subservient chickenみたいなものか

525 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 22:54:00 ]
? like(you, me).
no.

〜 Fin


526 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 21:06:43 ]
prologでSWAN SONG。
ピンポンピンポンピンポン!ってできたらいいなぁ。

527 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 23:16:07 ]
SWI prolog はEmacsで使うとプロンプトが出ないんですが、
対処法はありますか?


528 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 23:22:37 ]
Emacs22 + SWI-Prolog 5.7.15 on Linux で使ってるけどプロンプトでてるな。
環境は?昔、Windows上でつかってるときはなんか使い難かった記憶がある。
実用上問題はなかったのでそのまま使ってたけど。

529 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 02:46:19 ]
>>528
Windows上でMeadow+SWI-Prolog(Version 5.6.62)です。
実用上は問題ないのですが、どうも気持ち悪かったものですから。





530 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 17:59:35 ]
ファンクタに破壊的操作を加える述語ってありましたっけ?

531 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 18:26:46 ]
関数子(ファンクター)をいじるというと…
例えばf(a,b)、f(123)などのfを一気にffにするとか?
述語名には影響はないんだろうか。(いや、複合項のことだろうとは思うけど)

532 名前:デフォルトの名無しさん [2009/10/07(水) 05:36:52 ]
問題.
久方のなかなる川のうかひ舟いかにちぎりてやみを待つらむ 藤原定家

この短歌に現れる枕詞「久方の」は
「なかなる川」= 京の中なる川 = 桂川 の
桂から月が連想されて、その月の光に対して、
添えられていると考えられる。

この関係を示す述語「久方のについて思い巡らし」を定義せよ。

533 名前:デフォルトの名無しさん [2009/10/07(水) 07:03:07 ]
プロログって

述語(主語や目的語や補語)

って形式だよね?
なんか自然言語の語順と一致しなくて気持ち悪いんだけど
その一因は、当時の計算機の処理能力(速度とリソース)にあると思うんだ。

いまのコンピュータ性能なら、自然言語の語順で同様のことができると思うのだけど
そういう言語でプロログに近い推論を行うものってある?

534 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 08:58:37 ]
たぶんない。作ればあるだろうけど。

自然言語に近い語順、はいいけど、機械が扱うためにはきちんと形式化されてる
ことが必要だからね。

535 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 09:50:36 ]
>>534

X:>自然言語に近い語順、はいいけど、
O:>自然言語に近い語順、は「どーでも」いいけど、


536 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 10:15:11 ]
>>533
自然言語の語順と一致しなくて気持ちいい


537 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 10:51:45 ]
気持ちがよければそれでいいのかと問いたい
問い詰めたい

538 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 10:56:43 ]
自然言語にすり寄っても、論理学との関係がややこしくなったら本末転倒じゃないかな

539 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 11:15:46 ]
英語的:  主語 <述語> 目的語 :- ... .
日本語的: 主語 目的語 <述語> :- ... .

この場合は述語指定に< >を使ってしまうので大小比較の時の記号表現にちょっと困る。
日本語的: (主語,目的語)述語 :- ... . とすれば現在と差なく処理できるが、
英語的: には適用できない。



540 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 11:41:56 ]
relationなんで主語があるとは限らない。目的語も。

541 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 12:53:11 ]
格概念への割り当てが面倒になって飽きること必至

542 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 16:03:17 ]
>>533
計算機の処理能力というようなことではなく、考えに考え抜かれて、
現在の言語仕様が作られたように思うなぁ。

543 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:51:10 ]
言語仕様はね。

構文は 述語(引数0, 引数1, ...) でなくたとえば (引数0, 引数1, ...)述語 も
ありだとはおもうけど、今の形になったのは計算機のリソースの問題とか
じゃなくて、数学の記法における慣習とか、そこらへんでないかと。

自然言語ライクな文法って、例えば Mind みたいな文法のことを
言いたいのかな?

544 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 03:35:50 ]
述語が先にくる自然言語(タガログ語とか)を使えばよろしい。


545 名前:デフォルトの名無しさん [2009/10/09(金) 12:34:55 ]
op で上手く定義すれば、ある程度は自然言語に近付けられそうな気がする。

546 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 12:44:04 ]
>>545
pc12.2ch.net/test/read.cgi/tech/1179157784/30
とか。

547 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 20:00:13 ]
>>543
フレーゲあたりじゃない?述語論理の形式が整ったのって。
数学の関数 f(x) にヒントを得たんじゃなかろうか。

548 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:06:17 ]
K-Prologについて教えてください。SWIに比べて制約があるようなのですが、
下記のコードはSyntaxErrorになります。
my-reverse([], []).
my-reverse([X | Xs], Ys) :-
my-reverse(Xs, Zs), append(Zs, [X], Ys).

SWI-Prologでは問題なく動くのですが。
K-Prologが本来の文法を維持しているのか?単なるバグなのか?
因みに下記だとK-Prologでも動きます。
my-reverse(R,L) :- my-reverse(R,L,[]).
my-reverse(R,[],R).
my-reverse(R,[A|L],LL):-
my-reverse(R,L,[A|LL]).


549 名前:548 mailto:sage [2009/10/12(月) 20:04:58 ]
すみません、わかりました。K-Prologの意味不明なエラーに
悩まされていたのですが原因は単純でした。
コードの最後の行に改行がないと正しく読み取られないようです。
お騒がせしました。



550 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 09:05:17 ]
最後に改行ないと本来はエラーなのかな?

551 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 17:36:30 ]
>>550
SWIやYAPでは問題ないのでうっかりなのでしょう。

K-Prologはシンプルでなかなかいいです。
最近、多忙によりメンテされていないようですけど。

552 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 18:42:25 ]
>>551
<終止符>は二文字で第一文字が"." 第二文字がasciiコード32以下の
文字ですから、K-prologの解釈が正しいと思います。


553 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 18:49:27 ]
asciiコード32以下、という定義はちょっと面白いな。
0x1a(^Z)でもいいわけだ。

554 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 19:37:18 ]
節と節の間に空白がなくて駄目だったという事態はわりとよくあると思うけど、
ファイルの終端という罠があったか。

555 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 20:53:06 ]
32以下ってことは空白でもOKなのかな?

556 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 21:00:10 ]
もちろんOKでしょ。最後に改行がなくても。

557 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 21:08:01 ]
Prologの述語ってどの程度まで規格化されてるのでしょう?
M.Hiroiさんの順列生成のコード、K-Prologで動かないので調べてみたら
select述語の第1、第2引数の順番が逆に定義されていました。
perm([],[]).
perm(Xs, [Z | Zs]) :- select(Xs, Z, Ys), perm(Ys, Zs).

/* M.Hiroi
perm([],[]).
perm(Xs, [Z | Zs]) :- select(Z, Xs, Ys), perm(Ys, Zs).
*/


558 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 07:23:11 ]
少ししらべたのでメモ。
select(X,L,<L引く[X]>)の形
・Quintus Prolog - library(lists)
・SICStus Prolog - library(lists)
・SWI-Prolog - library(lists)
・GNU Prolog
select(L,X,<L引く[X]>の形
・n-queensのプログラムにちらほら見られる(有名な本に載っている?)

559 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 07:32:57 ]
ちなみに、SWI-Prologの古い版(3.1.2あたり)では後者のリスト先行の形もあったみたいだけど
あまりちゃんと見てない。
www.google.com/codesearch?hl=en
lang:prolog ^select\(\[



560 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 07:54:53 ]
Prolg-KABA では「ふろく」のプログラムの例としてQUEEN.PLが
載っていて、この中のselect/3は後者。

561 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 07:56:05 ]
漏れのK-PrologからSWI-Prplog移植の経験(ほんの少し)だと、
[K] name(X, Y) が [SWI] string_to_atom(Y, X) てのがあた。

562 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 07:56:22 ]
Prolog-KABAねw

563 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 08:06:15 ]
Prologの場合、述語が双方向性を持つことが多いという特殊事情があり、
たとえば、member(A,L) はリストLにAが存在するかを問う場合この順序が
自然だが、Lから一要素づつ順に取り出す場合はPrologとして自然なのは
member(L,A) だろう。

564 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 08:06:29 ]
Prolog-KABAか、懐かしいね。
自分はPC98買えなかったから、会社のHI-UX Prolog(超マイナー!)を触っていた。
その後、WinなPCを買ったけど、当時は日本語がまともに扱えて
個人購入できるのはK-Prologくらいだったから、重宝していたよ。

565 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 08:10:09 ]
>>563
双方向性という特殊事情があるからこそ
どちらが自然であるかは一概には言えない、ってことだよね?

566 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 08:12:11 ]
SWIにもname/2はあるみたいだけど、整数の扱いが違うとかそういうこと?
www.swi-prolog.org/pldoc/doc_for?object=name%2f2
> (e.g. `name(N, "300"), 400 is N + 100' succeeds)

www.kprolog.com/doc/ja/builtins/meta/creation.html#name_2
> アトミック項をその表記である文字列と相互変換します。
これだと数がどうなるのかわからないけど。

567 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 08:18:17 ]
>>565
そうです。
もっともmember/2についていうと、append/3というスーパーセットがあり、
?- member(A,[1,2,3]). ?- foo(L),member(2,L). は

?- append(L1,[A|L2],[1,2,3]). ?- foo(L),append(L1,[2|L2],L).

と同じ意味になります。append/3くらいの地位を築いていると、
Aの位置が少々不自然でも文句を言う人はいないのかもしれない。

568 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 08:29:31 ]
>>566
スマン、6年以上も昔の不正確な情報だったかもしれない。
当時作った(K-Prologの)プログラムに、以下のようなコードが残っていたから。

stringToPathList1([A|X], [B|Y]) :-
  !,
  name(B, A),
/* for SWI-Prolog
  string_to_atom(A, B),
*/
  stringToPathList1(X, Y).

569 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 08:31:26 ]
ああ、昔のことだとわからないね



570 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 08:43:03 ]
>>567
自分の場合、双方向性の必要の無い(入出力が明確な)リスト処理については、
関数型言語風のmap_list/select_list/if_listみたいなライブラリを作っているよ。
どれも function(入力リスト, 高階述語, 出力リスト) というスタイルで統一している。

571 名前:570 mailto:sage [2009/10/14(水) 08:54:06 ]
>>570のif_listは間違いだ。reject_listに訂正。
if系は第2引数の高階述語向けとして定義していた。

あと、(appendに相当する)リストの結合処理は作っていないや。
もし作るとすれば、merge_list(入力リスト1, 入力リスト2, 述語, 出力リスト)
みたいな感じになると思う。

572 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 09:11:31 ]
プロログで入力、出力とな!(麿のAA略

573 名前:570 mailto:sage [2009/10/14(水) 10:25:50 ]
>>572
スマンw

ただ、並行論理型言語(KL1(GHC), Concurrent Prolog)の存在を知ってしまったから、
はたして逐次Prologにも双方向性(=非入出力)の概念が必須かどうかについて、
疑念を持ち始めていた。

もちろん、find_allといった全解探索に双方向性は必要。
でも、その後の得られた解の加工処理については、双方向性はかえって邪魔になる、
言い換えると、入出力を明確にした方がプログラムは読みやすくなると思う。

574 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 10:33:15 ]
双方向性を狙って書く人は少ないと思うね。
図らずも双方向性が得られたという歓びで十分だな。

575 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 10:42:28 ]
append/3 一つで済ませるをよしとするか、別述語とするかという話ですね。
Prologは基本的に単位節述語定義とappend/3だけで書くものだ、でいいと思うけど。

576 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 11:36:25 ]
>>558
>>560
どうやら
select(L,<L引く[X]>,X)の形
もあるね。
% from Sterling and Shapiro, "The Art of Prolog," page 211.
と出典のあるやつ。

577 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 11:52:29 ]
p右向き(X0,X) :- q(X0,X1), r(X1,X2), s(X2,X). % p右向き --> q, r, s.
p左向き(Y,Y0) :- s(Y1,Y0), r(Y2,Y1), q(Y,Y2).
あなたも順序を変えたくなーる

578 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 12:01:47 ]
>>575
述語定義の中は全部appendで大いに結構だけど、ここではその一層上の
話じゃないか。ライブラリに登録する時の述語頭部の仕様のことではないか。

579 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 16:35:14 ]
GoogleブックスでThe Art of Prolog(第2版)を見てみたら、
select/3は211ページ目ではなくもっと前の方に(要素先行の形で)載っていた。
ひょっとしたら1988年の初版とずれがあるとかいうオチかも。



580 名前:557 mailto:sage [2009/10/14(水) 21:37:52 ]
みなさん、情報ありがとうございました。


581 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 16:25:27 ]
pc12.2ch.net/test/read.cgi/tech/1254967587/486
の話ですが、こちらへ引っ越すことになりました。話の発端は
変数に情報をどこまで含ませられるか、コメントではだめなのか、でした。
A + B + C :- 売上入力検査(A,B,C,_診断), ... . と

_出荷日 + _商品番号 + _数量 :- 売上入力検査(_出荷日,_商品番号,_数量,_診断), ... .

の比較から、私が、
出荷日 A + 商品番号 B + 数量 C :- 売上入力検査(A,B,C,_診断), ... .

はPrologではできないので、としました。型出荷日のA、型商品番号のB、型数量のCが可能であるならば
_出荷日という蜻蛉のような表現よりは強いということです。
型について書いているのですが、私の視点は100%ソースコードの表現力に向けられていて、
コンパイラに於いて語られる諸問題とはほとんど無縁です。

582 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 17:31:16 ]
# 自分も「美しい言語」スレから、こちらへ引っ越してきました。

>>581
最終的に実現したい事は、Prologで(「データ型機能」を実現したい!と言うよりも、)
「名前付きフィールド機能」を実現したい!という事ではないかと推測します。
たとえばRubyのメソッド定義であれば、

 def 売上入力検査(出荷日, 商品番号, 数量) .... end

と記述する代わりに、ハッシュを使って

 def 売上入力検査(*入力データ) .... end

と記述し、そのメソッド呼び出しを以下のように記述する事が可能です。

 売上入力検査( '出荷日 => 20091016, '商品番号 => 200, '数量 => 36.4 )

これに類似した述語記述を、(更には、もし可能であれば言語レベルでの型定義/宣言/検査も)
Prologで実現したい!ということではないかと考えました。
SQL言語であれば、既にレコードとして実現されている機能ですから、
(RDBと比較して)Prologデータベースが使いづらい点だと思われます。

このような認識で合っているでしょうか?

583 名前:デフォルトの名無しさん [2009/10/16(金) 17:47:05 ]
出荷日(A) + 商品番号(B) + 数量(C) :- 売上入力診断(A, B, C, _診断結果), …

だと順番が入れ替えられないのが問題なのかな?

584 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 17:56:51 ]
>>583
いや、インタプリタのトップから、
?- 20091016+200+34.6.
# 売上入力検査 true 売上 assertz(売上('20091016','0200',34.6,'2009-10-16 17:55:00.000000')) 済み
yes
?- というように使いたい。そのためには 出荷日(A) ではダメです。

585 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 18:12:01 ]
Prologを拡張して、
{A | 出荷日(A)} + {B | 商品番号(B)} + {C | 数量(C)} :-

のような表現を可能にすれば、?- 20091016+200+34.6.
は実現します。これは1980年代に中島秀之氏によって「項記述」という名で
Prolog拡張の提案として出されたことがあります。

586 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 18:26:19 ]
>>582
私の意図したのはどちらかというと、>>585の型そのものですが、
この { _変数 | _型記述 } の_型記述部分にatomがくると無条件に
真となる、と定義すれば「名前付きフィールド機能」らしきものには
なります。しかし、フィールド名からどうやって呼び出すのかという
問題を解決せねばならず理論的なアプローチが必要でしょう。

587 名前:582 mailto:sage [2009/10/16(金) 18:27:58 ]
>>584
>いや、

ということは、(>>582の)名前付きフィールドは不要であると考え、次の質問に移ります。

>いや、インタプリタのトップから、

インタプリタのトップレベルにこだわる理由は何かありますか?

たとえば、実行例を以下であるとし、

 ?- read_record.
 20091016+200+34.6. # <-- キーボードから入力
 yes
 ?-

とし、述語 read_record の中で 入力値検査と assert を実行した場合、
何が問題になりますか?

588 名前:582 mailto:sage [2009/10/16(金) 18:36:21 ]
>>586
スイマセン、>>587をカキコする前にスレをリロードしてませんですた。
>>586へのレス内容は、今、考えています。

589 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 18:52:13 ]
>>587
インタプリタのトップからに拘るのは、私がそれの虜になったから
ですね。元々一覧表のようなものが嫌いで、巨像をなでるような
細部の積み重ねで本当らしきものを築き上げることを好みます。
沢山、柔軟に質問できるものをよしとします。少なくともその方が
敏感でいられます。



590 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 19:33:55 ]
グラフを述語で表現しようと思っています。
e(1,2). e(3,2).
のように点を数で表し、点の接続をe(X,Y)で表そうと思います。

ところで、グラフをプログラム中から変更したいのですが、
retract(e(1,X)).
とするとエラーになります。assertしたものはOKなのですが、
予めテキストに書いて読み込んだものはエラーとなります。
こういう場合、どうするのが定石なのでしょうか?

591 名前:582 mailto:sage [2009/10/16(金) 19:41:43 ]
>>586

2点、要求仕様に関する質問があります。

まず、>>585の紹介してくれた中島氏の記述方式は、フィールドを前提としています。
たとえば、「変数 A の フィールド名は '出荷日' である」と宣言してます。
それに対して、>>586のレスでは、「名前付きフィールド機能らしきものになる」と
肯定しています。

その一方で、>>584のレスにある「いや」という表現から、「名前付きフィールド機能は
不要である」という意図のようにも読み取れるます。

これら二つの事柄は、自分の中では「矛盾」しているような気がしています。
ここから推測される意図として、以下を考えてみました。

・述語定義では名前付きフィールドを使いたい。
・ただし、問い合わせでは(フィールド名を省略した)タプルを使いたい。

この解釈で合っているでしょうか?

2点目の質問です。

# ここは>>587の後半にある質問内容と同一ですから、省略します。

ご返答を願います。

592 名前:582 mailto:sage [2009/10/16(金) 19:48:31 ]
# またリロードせずにカキコやっちまったゼ....orz

>>589

要求仕様について、了解しました。

# ご返答を頂いたので、>>591にある2番目の質問は無視し、
# 先頭の質問に対するのレスだけでOKです。

593 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 20:25:38 ]
GHCの処理系で今も現役のものってありますか?
また、and/or並列を自動的にやってくれるものってありますか?


594 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 20:59:01 ]
>>591
一つ違うかなと思うのは、中島氏のものは後で確認しますが、私が考えているのは
出荷日(X) :-
integer(X),
今日(_今日文字列),
atom_to_term(_今日文字列,_今日整数),
X >= 20090101,
X =< _今日整数.
のような検査述語が定義されていて(20090932なども許す不完全なものだが)
{ A | 出荷日(A) } の出荷日(A)は単一化の付加機能として適用(call)される
ということです。ちょっとfindall/3の第二引数に似ています。
これで型出荷日(実は述語)と変数Aの関係が定義できます。
しかし、これは頭部による定義であり、副目標の引数にまったく同じ型の
変数は場合によると大量に発生しますから、それらの変数をD,E,F,G,H...と
置いていくと、その型についての情報はこの節の中にはないということに
なってしまいます。そのことから現在のPrologの枠組みでは型を取り入れ
それによってソースコードの情報価値を高めることはあまり期待できないと
いう結論になってしまいます。
名前付きフィールドも同様の理由から否定的にならざるをえません。


595 名前:594 mailto:sage [2009/10/16(金) 21:11:46 ]
そもそもPrologとは論理変数のストリームを繋ぎ合わせる錬金術のことですから、
いちいち型など考えていられるか、ということになります。単純に言うと。
これは「もっとも美しいプログラミング言語は」スレで叫ぶべきことでしょうね。

596 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 21:17:00 ]
>>592
と、突然正反対の結論になってしまいました。申し訳ない。
実はこの話、昔から何度も何度も持ち出してはうまく解決できず、
放棄を繰り返しているのです。

597 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 21:28:38 ]
>>590
IF/Prologですか?

598 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 21:42:14 ]
>>597
いいえ、K-PrologとSWI-Prologで試しました。


599 名前:582 mailto:sage [2009/10/16(金) 21:45:48 ]
>>594
すいませんが、ここでレスをカキコするとスレの流れが発散しそうなので、
直接のレスは控えます。

何をしたいのか、そして実現方法としての中島氏の方式に関する質問へのレスを待ちます。
もし質問の意味に不明点や疑問があれば、質問を返してください。それには対応します。

# Prologで名前付きフィールドを実現する方法はいくつかあります。
# おそらく、中島氏の方式も、その一つであるように見えます。
# ただ、今の状況では、何も話せません。



600 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 22:08:35 ]
>>590
>予めテキストに書いて読み込んだものはエラーとなります。

具体的には、どういう方法で読み込んだの?

>>593

GHCなんて超マイナーな言語を持ち出したってことは、
ICOTライブラリのサイトを見てるし、KL1という名前は知っているんだよね?
(まさかHaskellの処理系じゃないよね?w)

あと、後半の質問は知らない。

601 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 22:10:01 ]
>>598 これでどうでしょうか。
ファイルの頭で :- dynamic(_述語形式リスト). を宣言します。

:- dynamic([e/2]).

e(1,2).
e(3,2).

602 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 22:46:23 ]
>>601
うまくいきました。ありがとうございました。

今、ケイリーの木の公式の証明に使われているアルゴリズムを
Prologで書こうとしているところです。助かりました。

603 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 06:32:27 ]
>>599
要求仕様に含まれる情報をできる限り遺漏なく、どうしたらソースコードに
盛り込めるか。これが私の課題で、型の採用は一案に留まります。
コメントでよいものか、関数名、述語名、論理変数に反映するべきなのか。
論理変数に反映したとして、どんな意味があるというのか。
それから、理論だけではなく、実務的にどれだけ有効であるか。それを測定できるか?
まったくの素人がPrologを一読して理解することがあり得るか?どうすれば可能か?
以上のような視点からの書き込みだったので一旦身を引きます。

項記述については、多分初出の第二回ロジックプログラミングコンファレンス(1984)の
Proceedingが手元にあるのでもう一度考え直して、近いうちに書き込みます。

604 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 07:39:57 ]
このところの流れは単一化が邪魔してる部分の話か。
Prologの不人気の原因もそこに帰するような気もするね。



605 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 09:15:42 ]
>>600
ガーン、GHCというか、ホーン節にガードを付けるって考え方はマイナーなんですか?
KLICも知ってますが、現役で開発・メンテされてる処理系ってないもんでしょうか。
Prologってもはや現実的プロジェクトでは使われることはないのかな。


606 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 09:30:09 ]
マイナーというなら確かにマイナー。
GHCで表現しなくてはならないような課題を与えられた人はほとんどいない。
そういう意味でマイナー。美しさという点では一頭地を抜いてると思う。
Prologはプログラマも処理系も健在だから、いつでもプロジェクトを起こす
ことは可能だけど。

607 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 15:28:07 ]
>>605

>>570だけど、逐次Prologそのもののがマイナーであることは、
このスレの寂れ具合で分かると思う。並列論理型に至っては....。

といっても、漏れは研究職でもなく、普通の職業プログラマでしかないから、
海外/国内の学会の動向を追いかけてるわけじゃない。
専門家に聞けば、また違った見解が得られると思う。

個人的には、過去に、業務でPrologでステートマシンのシミュレータを開発していたが、
そのエンジン部分をConcurrent Prologで書き換えたことがある。
処理系としてはbit誌に掲載されていたミニインタプリタに改造を加えたもの。
それ以降、活用の機会は無い。(逐次Prologは現役で、ツールとして活用しているが....。)

ただ、パイプライン構造のようにプロセスが一方向を向くシステムに限定すれば
逐次論理型言語で記述可能だけど、一般的なネットワーク構造を持つ場合には
(ストリームプログラミングによる)並列論理型言語による記述が適している。
だから、今は、システム全体を並列型で、個々のプロセス内部のアトミックな発火を
(関数としての)逐次型で記述するという、ビジネス向けシステム仕様記述技法に
応用できないかと考えている。JSD法(ジャクソンシステム開発法)に近い発想。
処理系としては、前記のミニインタプリタを復活させる予定。

608 名前:デフォルトの名無しさん [2009/10/17(土) 17:49:20 ]
Oz言語(処理系Mozart)は、どうなんだろ。
それを中心に使ってる有名な分厚い本(ゴメン題名忘れた)で、GHCとかの並列論理型言語の概念も紹介されてて、その欠点も指摘してたんだけど、
それだったら、Ozは、その欠点を克服出来るようになってないのかな。

609 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 18:23:09 ]
Ozはマルチパラダイム言語であることくらいしか分かっていないけど、
問題解決の有効な一手法だと思う。その本は読んでいないけど、
おそらく並列論理型言語の問題は処理効率ではないかと想像。

ただ、論理型言語の魅力は、(処理効率を引き換えに得た)柔軟性と拡張性にあると考える。
だって、論理型言語の枠組みの中で、関係データベース、構文解析、関数、並行性、
制約解消、そしてオブジェクト指向を、次々と実現してきたんだから。
だから、プロトタイプやモデルシミュレーションといった、
処理効率の問題を無視できる用途であれば、
論理型言語(Prolog)は、まだまだ成長/発展を見込めるハズであると思う。

逆にマルチパラダイム言語は、魑魅魍魎というか混沌とした世界のように見える。
もちろんOzは触った事がないから、無知故の偏見だと思うが....。



610 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 19:06:00 ]
>>582
先程から売上入力検査の部分を再考していたのですが、ドキュメントとして
ここは必要という部分だけ、型(らしきもの)を添えるというのは
やはり有効かもしれませんね。

  消費税計算(商品番号 => 200,数量 => 36.4,消費税率 => 5 %,売上金額 => A,消費税 => B),
  売上金額検査(A,売上金額 => C),

というようなコードだとしても、情報量は明らかに豊かになります。
消費税計算の中で金額を計算するとしている部分は不自然ですが。

611 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 20:51:21 ]
>>610
Prologへの名前付きフィールド機能拡張の試みはいくつかありますが、
その一つに「レコード・プログラミング」という概念があります。
レコードとは、C言語の構造体やSQLのCERATE TABLE文のような、
<フィールド, 値>のペア(対:つい)から構成される集合を意味します。

たとえば、

 消費税計算(200, 36.4, 5, A, B)

というPrologの述語記法は、以下のようなレコード記法で書き換える事ができます。

 [関係→消費税計算, 商品番号→200, 数量→36.4, 消費税率→5, 売上金額→A, 消費税→B]

さらに、消費税計算 を型とすれば、以下のように表現できます。

 [商品番号→200, 数量→36.4, 消費税率→5, 売上金額→A, 消費税→B]:消費税計算

'消費税計算' とは、「型(らしきもの)」なんかじゃなくて、レコード・プログラミングの世界では、
まさしく「型」なんです。型の導入によって、「個別消費税計算 is_a 消費税計算」や
「総合消費税計算 is_a 消費税計算」のような型階層(継承)の導入が容易になります。
おそらくデータ型機能(型定義/型宣言/型検査)の導入も可能になるでしょう。

そして、レコード・プログラミング自体は考え方(パラダイム)ですが、もしもその考え方を
Prolog言語へ直接的に導入したとすれば、それはまさに、>>610のような記法になるのだと思います。

なお、このカキコのネタは、以下の書籍にある「レコード・プログラミング」の章です。
・続新しいプログラミング・パラダイム, 横田一正他著, 共立出版, 1990年







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<227KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef