【論理】Prolog【初心者】

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2010/11/06(土) 13:00:56
Prolog初心者のスレ

これは良い言語だ…
2011/04/25(月) 23:18:32.73
エキスパートシステム書けるのですか。
…冷静に考えればprologなればこそ書けなきゃおかしいか。

IBMがprologで自然言語処理がうんたらかんたらしてるらしいので
もっと注目されてほしいなぁ。
2011/04/27(水) 18:00:50.94
>>160
急に注目されはじめたようですよ。
2011/04/27(水) 19:57:36.82
エキスパートシステムなんてどんな言語でも簡単に書ける。
prologはファクトの無限導出を副作用をつかって
避ける必要があるので、むしろ面倒なくらいだ。
2011/04/27(水) 20:58:39.35
>>162
「どんな言語でも」書けるもんなら書いてくれ。
2011/04/28(木) 11:32:17.24
どんな言語でもというと語弊があるだろうけど、そんなに難しいものでは
ないという点には同意。
Prologだとappendだけで書けるレベル。かってはスタックオーバーフローや
GCの頻発に悩みながらだったが、現在は、2GB以上のプロセスが当たり前で
データをすべて引数で持ち回っても問題はない。
Prologの利点は、何といっても作り込みが容易なこと。業種、企業、生産現場に
よって、全く異なるデータのサンプリングの方法を仕様がしっかり文章化されて
いれば、簡単に述語として追加・変更できることだろう。
2011/04/28(木) 11:50:39.82
最近のエキスパートシステム事情には疎いのだけれど、
かっては確かにルールをシンボル化してその論理式を
assert,retractしながら利用するというような手法が
使われていたと思うけど、今は、
非決定性のappend/3 を ...,apppend(L1,[A|L2],L),filter(A,B), ...
のように使って、例えば、Bの排他的要素がL1,L2に存在
するか確かめながら(これもappend/3)進むというような
ものがほとんどだと思う。
2011/04/28(木) 23:29:22.17
>>164
私が今書くとすると、"Prolog Programming For Artificial Inteligence" の14章を
一度読みなおしてからということになるが、十分に難しいよ。
他の言語でやさしいかどうかは知らないが。
2011/04/29(金) 00:45:50.54
Prolog全然使えん。簡単なループ文書くのですら一苦労だ。
2011/04/29(金) 12:35:51.70
斬新な用途ですね。

2011/04/29(金) 21:02:38.40
prologが得意な人は行列積とかどんな風に書くのかな

自分で書くと、とても綺麗とはいえないコードになる
2011/04/29(金) 22:04:54.18
線形代数関係は、LAPACKに処理を投げるのがプログラミングの定石では?
PrologからLAPACKにどうやって処理を投げるのか知らないけど。
2011/04/29(金) 22:13:50.07
実用にするならそうだね。
ただ、言語のプログラミングスタイルの話だから…
2011/04/30(土) 10:38:28.54
>>169
転置も含めて、単純な再帰述語が六段くらい。
難しいところは全くないからそれでいいのでは。
2011/04/30(土) 11:22:20.41
>>172
私が今書くとすると、"Matrix Computations 3rd Edition"を
一度読みなおしてからということになるが、十分に難しいよ。
他の言語でやさしいかどうかは知らないが。
2011/04/30(土) 12:01:22.84
>>173
> 他の言語でやさしいかどうかは知らないが。

APLという軟弱言語なら演算子三文字。

軟弱言語巡りをしてPrologにも立ち寄っているけど、
何を書いてもエラーか無限再帰になってしまう。
未だ正しい記述が出来ない orz
2011/04/30(土) 12:21:31.48
>>174
せめて計算環境にあわせてブロック分割くらいしようぜ
2011/04/30(土) 13:21:02.33
>>174
こんな感じじゃないかな。個々の述語は単純だよ。

m_mult(L1,L2,X) :- m_trans(L2,L4),m_mult_1(L1,L4,X) .

m_trans([],[],[]) :- !.
m_trans([[A|R]|R1],[A|R2],[R|R3]) :- m_trans(R1,R2,R3) .

m_trans([[]|_],[]) :- !.
m_trans(L,[B|R1]) :- m_trans(L,B,R2),m_trans(R2,R1),!.

m_mult_1([],_,[]) :- !.
m_mult_1([A|R1],L,[S1|R3]) :- m_mult_2(A,L,S1),m_mult_1(R1,L,R3).

m_mult_2(_,[],[]) :- !.
m_mult_2(A,[B|R2],[C|R3]) :- m_mult_3(A,B,C), m_mult_2(A,R2,R3).

m_mult_3([],[],0) :- !.
m_mult_3([A|R1],[B|R2],S) :- S1 is A * B,m_mult_3(R1,R2,S2),S is S1 + S2.
2011/05/05(木) 11:19:35.03
コピペなんですがこういうのも論理型言語で記述できるのでしょうか?

> 357 :名無しさん@涙目です。(東京都):2011/05/02(月) 19:15:52.75 ID:Of9kzpjA0
> こんなのもあるな
> 登場人物は4人。(男の子、女の子、アイスクリーム屋さん、お母さん)
>
> 男の子と女の子が公園で遊んでいると、アイスクリーム屋さんがきます。
> ふたりはアイスが食べたいが、男の子はお金を持っていません。
> アイスクリーム屋さんが「今日はずっと公園でお店やるよ。」 というので、男の子は家にお金を取りに行きます。
> 途中でアイスクリーム屋さんの気が変わり、学校でお店を出すことになり
> 女の子に「男の子に学校に来るように伝えに行って」と、頼みます。
> アイスクリーム屋さんが、学校に向かう途中で、お金を取りに行った男の子に会います。
> アイスクリーム屋さんは男の子に学校にお店を出すことにした事を伝え、一緒に学校に行きます。
> その頃、家に着いた女の子はお母さんから、「男の子は、もうアイスを買いに行った」ことを、聞きます。
>
> さて、ここで問題です。女の子はどこに男の子を探しに行くでしょうか?
2011/05/10(火) 17:16:11.53
よくわからんけど、これは情報格差を見失わないでいられるか、みたいなのを確かめる試験みたいなもので、
パズルではないような
2011/05/10(火) 19:26:17.19
発達心理学の有名な問題で、
女の子が一定年齢以下だと公園に行くけど、一定年齢以上だと学校に行くとか、そんな話じゃなかったかと。
2011/05/10(火) 20:14:33.59
「女の子は男の子が学校に向かうことを知っているか?」
とかそんな形でモデル化できないこともないかな。
この場合「知らない」なので「公園に行く」になるような。

その文章が表現してる知識全部がうまくいくかどうかはわからない。

>>179 逆かな。
2011/05/11(水) 18:29:25.78
>>179
そうそう確かコピペ元がそんなスレだったと思う
発達障害か何かで女の子の立場で考えられるかどうかを見るテストだったような
論理とは関係ないか
2011/05/11(水) 18:48:08.31
自然言語の曖昧さとかに依存してるなら難しいけど、
(有名な例では、
「宵の明星は金星である」「金星は宵の明星である」
「明けの明星は金星である」「金星は明けの明星である」はいずれも真である。
では、「宵の明星は明けの明星である」は真か、みたいな)
入り組んでいるだけなら論理として扱えると思うけどね。
2011/05/11(水) 21:02:08.06
>>180
> >>179 逆かな。

なんかそんな気がする。

>>181
より単純な例示をすると以下のよう。

1.男の子と女の子が同席している場で、先生が"not(Human(Socrates))."と教える。
2.男の子が退席した後で、先生は女の子に"Human(Socrates)."と教える。
3.「男の子は"?- Human(Socrates)."という問いにどう答えるか?」と女の子に尋ねる。

年端のいかない子供は、
男の子が"Human(Socrates)."を知らないという情報をうまく処理できず、
3の問いに"Human(Socrates)."と答えてしまうのだとか。
2011/05/11(水) 21:12:23.17
訂正

× Socrates
○ socrates

だった。

あと女の子の応答もYes/Noだ。
185デフォルトの名無しさん
垢版 |
2011/05/21(土) 23:11:01.23
あるリストから要素数Nの部分集合が全部ほしいんですがどうすればいいでしょうか?
2011/05/21(土) 23:54:31.20
>>185
http://www.geocities.jp/m_hiroi/prolog/prolog02.html
部分集合の判定
selects([], Ys).
selects([X | Xs], Ys) :- select(X, Ys, Ys1), selects(Xs, Ys1).
2011/05/22(日) 00:13:53.59
>>186
はい、自分もそこを見て
selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z)
みたいにして要素数Zの部分集合を得て、さらに並べ替えがいらないんで

selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z),sort(Xs,Xs).
みたいにしたんですが、なんかすごくブサイクな感じなんでなんかないかなーと思いまして
2011/05/22(日) 00:33:02.43
全生成して要素数N以外を捨てる
これが富豪か
2011/05/22(日) 02:41:57.82
>>187
http://www.geocities.jp/m_hiroi/prolog/yapp02.html
●問題32
?- combination(3, [a, b, c, d, e], X).
X = [a, b, c] ;
X = [a, b, d] ;
X = [a, b, e] ;
X = [a, c, d] ;
X = [a, c, e] ;
X = [a, d, e] ;
X = [b, c, d] ;
X = [b, c, e] ;
X = [b, d, e] ;
X = [c, d, e] ;
false.
2011/05/22(日) 03:13:51.21
>>189
うおーこんなのまで乗ってるんですね。
ありがとうございます。
2011/05/27(金) 23:13:42.01
今、学生がprologを学ぶ意義って何だろう?

いや、個人的には活用してるけど、俺みたいな言語おたく以外の
普通の学生が、カットの挙動やら、失敗駆動ループやらを
頑張って勉強する価値はあるのかな。
たぶん、大多数はprologなんて一生使わないと思われる。
2011/05/28(土) 00:09:52.15
この言語をマスターしたら論破できるようになるの?
2011/05/28(土) 00:13:38.05
>>192
そもそも何を論破したいの?
2011/05/28(土) 03:31:59.08
>>191
今後使うためとしか答えられない。我々の思考に最も
近い言語はやはりこの言語なのであって、その事が
評価される時が再び来るということだろう。
興味深いことは、結構優秀な学生にとっても
Prologは決してやさしくはないということ。これが謎。
2011/05/28(土) 05:00:47.97
>>191
それと、Prologはappendだけで書く言語です、と教えなかったら、
教えるほうが間違っている。
2011/05/28(土) 08:26:06.18
>>195
大学の講座は論理学絡みだからね。前提が。
実務では、実際appendしか使いませんね。
append使うためにはリストに取らなくては
ならないから、変換器として、findallは
多用するけどね。
2011/05/28(土) 08:33:14.38
>>191
学ぶ意義のある言語というと、JavaとかCとか?
つまらん学校だw

本当の学校ってのは、遊びに行くところ。
prologの授業受けてトラウマ/コンプレックス/やみつきになるくらいでちょうど良い。
2011/05/28(土) 08:36:19.95
SLDNFが人間の思考に近いとは思えんなあ。

prologで普遍的な価値があるのは純粋論理の部分だけじゃないか。
2011/05/28(土) 09:07:38.68
>>196
述語は非決定性に定義しておいて、
findallでリストに取り上げ、非決定性の
appendで切りだして処理するだけ。
アセンブラよりも遙かに単純でパターン
も少ない。
>>191 カットなんて、決定性にする
サインとしてしか使わないし、何が
難しいのだろう。
2011/05/28(土) 09:22:22.26
>>200
100%教え方が悪いんだろうね。大学の先生方のね。
2011/05/28(土) 09:54:25.63
>>199
まあ、逆に言えばその程度のものでしかないから、
必要になってからハウツー本でも買って読めばいいので、
大学で教えるほどの価値はないね。
2011/05/28(土) 10:34:32.82
>>201
私もそれで十分だと思うけど。
2011/05/28(土) 10:43:29.71
要は事務屋のSQL代わりってわけか。

そんなものに多大な国家予算をつぎこんだ日本って…
2011/05/28(土) 11:07:06.71
>>203
私に関しては、言い得て妙ということになるけど。
一般論としては言語はやさしいほどよいということも
言える。第五世代プロジェクトについていうと
Prologマシンに拘ったのがどうかな。
2011/05/28(土) 15:33:51.21
>>191
>学生がprologを学ぶ意義
教養。
2011/05/28(土) 15:37:15.41
>>194
>Prologは決してやさしくはない
手続き型がマシなだけで、関数型も論理
型も宣言型も同等にわかりにくいんだろ。
トップダウンのルールベースってのが
鬼門なんだろうな。

オレも、ややこしくなると結局、逐次的に
手続き的に処理を追っかけていくしな。
2011/05/28(土) 16:29:30.76
appendって何?リストの追加?
2011/05/28(土) 16:48:35.26
>>207
?- append(L0,[X|R],[1,2,3]).

L0 = [],
X = 1,
R = [2,3];

L0 = [1],
X = 2,
R = [3];

L0 = [1,2],
X = 3,
R = [];

no.
?-
2011/05/28(土) 18:19:29.52
>>207
?- length(L0,3),append(L0,[X,Y|R],[1,2,3,4,5,6]).

L0 = [1,2,3],
X = 4,
Y = 5,
R = [6];
no.
?- length(L0,3),append(L0,[X,Y|R],[a,b,c,d,e,a]),append(_,[Z|_],L0),append(_,[Z|_],R).

L0 = [a,b,c],
X = d,
Y = e,
R = [a],
_ = [],
Z = a,
_ = [b,c],
_ = [],
_ = [];
no.
?-
2011/05/28(土) 18:24:29.21
>>207

select(A,L,X) :- append(L0,[A|R],L),append(L0,R,X).

?- select(A,[1,2,3],X).

A = 1,
X = [2,3];

A = 2,
X = [1,3];

A = 3,
X = [1,2];

no.
?-
2011/05/28(土) 18:40:40.85
>>207
nth/3 の定義

nth(Nth,List,X) :- length([_|L0],Nth),append(L0,[X|_],List).

2011/05/28(土) 19:07:00.82
>>207

カンマで括られた文字列の検索(_文字列,_適合文字列) :-
    atom_chars(_文字列,Chars),
    append(_,[','|L1],Chars),
    append(L01,[','|_],L1),
    \+(append(_,[','|_],L01)),
    atom_chars(_適合文字列,L01).

2011/05/28(土) 20:29:06.72
なにこれ、こわい
2011/05/28(土) 21:25:53.31
>213
自分のやってることの意味を考えずに生きてきて、
ついにコードを見せることしかできなくなった
哀れな技術者の末路です

そっとしておいてあげてください。
2011/05/28(土) 22:22:23.55
>>203
このスレ 残滓で満ちてそう…
2011/05/28(土) 22:46:02.81
>>214
俳句が仮に三句から構成されているとすると、
少なくとも六通りのPrologコードが書けるということ。
Prologプログラマは饒舌にならなくては。
2011/05/28(土) 22:51:48.86
そうだね、100通りでも200通りでもかけるね。
そうやって、無意味なことに貴重な税金を無駄遣いしてきたわけか。
2011/05/28(土) 23:20:33.96
>>217
文章の構成が変わることによって当然意味が変わる。
意味が変わったことに敏感にプログラミングできるか
ということだけど。無意味と論証するのも難しいだろう。
2011/05/28(土) 23:28:52.02
だから、その行為をどう意義づけているの?
それは70年近いプログラミングの発展史のなかでどう位置づけられるの?

それを語らずにコードを垂れ流しても何の意味もない。
2011/05/29(日) 03:43:12.57
Prolog製の商用アプリケーションにGeneXusってのあるから何が出来るのか調べてみたらどうだい。

http://www.atmarkit.co.jp/im/cae/reports/0701/01.html
http://www.nikkei.com/tech/business/article/g=96958A9C93819499E2EAE2E2838DE2EAE3E0E0E2E3E2E2E2E2E2E2E2

http://itpro.nikkeibp.co.jp/article/COLUMN/20101207/354963/
http://itpro.nikkeibp.co.jp/article/Watcher/20101001/352528/
2011/05/29(日) 06:49:35.85
>[注2]「シーシャープ」と読む。CやC++をベースに米マイクロソフトが開発し、2000年6月に発表したプログラミング言語。
>従来のCやC++との違いは、インターネット経由でアプリケーション・サービスを提供するWebサービスに対応すること

日経・・・
2011/05/29(日) 07:38:29.49
> 「プログラマはもう要らない」。
> 大手物流会社のシステム子会社で新技術の社内展開を進めるマネージャーはこう言い切る。
> ここでいうプログラマとは、企業情報システムの開発プロジェクトでプログラムを作成する担当者を指す。

お前ら、もう要らないらしいw
2011/05/29(日) 07:53:41.82
俺の会社は業務の要を他社に依存してます宣言かw

>>221
どうして日経エレクトロニクスとか日経メカニカルとか、のようなレベルの記事を
書けないのかねぇ。
2011/05/29(日) 08:26:23.42
この記事を使って、リストラが進められそうだな。
「ツール導入で生産性が20倍になりますので、人員を1/20に削減します」
2011/05/29(日) 08:50:03.16
>>224
それで会社が潰れても責任は全て株主が負う。
気にするな。
2011/05/29(日) 08:52:30.24
どんどんやって、どんどん潰れっちまえ
2011/05/29(日) 09:27:54.50
それはいいが、prologの名前をこんないんちき商売に
使うのはやめて欲しい。
2011/05/29(日) 09:52:32.48
>>227
使ってみたことあるのかい?
2011/05/29(日) 12:15:34.41
>従来のCやC++との違いは、インターネット経由でアプリケーション・サービスを提供するWebサービスに対応すること
.NETをインターネットの事か何かだと思ったんだろうな
2011/05/31(火) 08:36:17.56
>>219
「発展」史については興味ないけど、
中江俊夫の「語彙集」みたいなものが、
書ければ面白いね。
2011/06/01(水) 12:41:08.98
>>230 引数一切なし?
2011/06/04(土) 16:42:06.23
Prologって業務ロジックを抽象的に表すのには向いているんじゃないだろうか
流行りの(?)DSLとかの代わりにならないかな
2011/06/04(土) 18:05:49.85
>>232
これ以上向いている言語はないと思うけど。
速度を要求されない、複雑化の可能性のあるロジックに
ついては、開発速度、プログラマの養成の容易さ、
保守のしやすさ、全ての点で優れている。
欠点はオブジェクト指向言語でなくて、.NETから外れて
いることかな。
2011/06/04(土) 20:53:49.88
おおすごい。

なんで普及していない/普及しなかったんだろう?
2011/06/05(日) 06:47:44.50
swi-prolog 5.11.14 で日本語が通りません。

'親子'('茂雄', '一茂')
.
のような日本語述語や日本語の項はUTF-8で書いて、
クォートでくくれば読み込めるんですが
listing しても文字化けしています。
日本語述語で問い合わせしても、そんな述語はないといわれます。

何か設定等必要なのでしょうか?
環境はwindows xp sp2です。
2011/06/11(土) 18:07:04.52
750 :デフォルトの名無しさん[sage]:2008/12/23(火) 10:10:50
>>747
http://www.swi-prolog.org/versions.html
UTF-8対応は5.6.x(開発版では5.5.x)から
2011/06/11(土) 18:08:07.51
おっと5.11.14かごめんw
2011/07/01(金) 18:39:03.66
>>236
ハッァァアァァァァァァアァアアァァァ?????????????
ゴミは何いってもゴミ
ゴミが口を開くな
239デフォルトの名無しさん
垢版 |
2011/07/11(月) 10:57:06.09
ぷろろぐ
240デフォルトの名無しさん
垢版 |
2011/07/13(水) 20:40:07.15
探索とかもろ並列処理できそうな

マルチコア時代の今なら並列prologとか出てこないかしら?
2011/07/13(水) 21:37:00.70
お好きなのをどうぞ

concurrent prolog
parlog
ghc
kl1
strand
2011/07/13(水) 23:41:15.56
>>238
すごいなお前勘違い全く以てしないのか
人をけなす前にもっとそのスキルを社会に役立てましょう^^
2011/07/14(木) 04:09:18.84
統合失調症の人にそんなこと言っても無駄
2011/07/14(木) 14:41:46.26
>>240
並列(並行)Prologということではありませんが、
AZ-Prologでは、マルチコアに割り振ることを、
処理系に委託することはできます。
2011/07/15(金) 03:23:58.99
>>240
こういうのとか
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.21.1017
2011/07/15(金) 05:33:59.23
>>240
http://nojiriko.asia/prolog/c135_256.html
AZ-Prolog処理系作者によって書かれたMPIライクな
マルチプロセス並列処理機能の使用プログラム。
2011/08/21(日) 10:38:06.34
JVM上で動作し、Javaからも呼び出し可能なprologがあれば!
2011/08/22(月) 09:38:53.46
prolog cafeがありますよ
2011/08/22(月) 15:03:23.52
>>248
d
javaツールに組み込んでみるんや
250デフォルトの名無しさん
垢版 |
2011/09/07(水) 11:51:09.81
完全な素人です。素朴な疑問なのですが、
同じ事をする場合、手続き的言語と比べて明らかに効率が悪くなる処理とかありますか?
例えばユニフィケーションって処理的にかなり重い気がします。
他にも配列と比べるとリストでは先頭の値しか扱えないとか、再帰呼び出しで
(一つ減らして)全要素を毎回コピーするとか手続き型の先入観を持ってると
効率が悪い気がするのですが、理屈の上では処理が増えるとか言う事は無いのでしょうか?
記憶領域もN^2/2とか必要になりそうですし。

ユニフィケーションのコストってどの位と見積もれるものでしょうか?
事実の数が10倍になると10倍の処理が必要なのですか?
それともSQLのインデックスみたいな事、もしくはキャッシュみたいなものを持っていて
それ程増えないのでしょうか?

変な事を書いているかも知れませんので、疑問自体がおかしいみたいな指摘でも結構です。
よろしくお願いします。
2011/09/07(水) 18:21:14.48
>>250
Prologは最も速いコンパイラ言語の100倍以上遅いでしょう。
その理由の過半がユニフィケーションと変数の繰り返し出現検査に
あると思います。指摘されたように配列がないこともある場合には
原因となります。それに比べればトレイルスタック等の追加的処理は
大きなコストになっていないはずです。

明らかに遅くて使えないのはビットマップの処理ですね。繰り返し
数百万のビットに対して演算する場合です。RPGも無理でしょう。

Prologはオンメモリデータベースですから、そこそこ速いのですが、
Prologが再起するためには、あなたが指摘したとおり、インデックス
などによる最適化によって、定義アトムを検索する能力を高める
必要があると思います。現在のレベルでは、数百万節の検索を
掛ける気になりません。
252250
垢版 |
2011/09/07(水) 19:29:25.63
>>251
丁寧な回答ありがとうございます。
確かにエンコードなんかで大量のデータをランダムに走査するとか不得意そうですね。

100倍程度なら何とか許容出来るのかもしれません。
ただ、ユニフィケーションの実際の動作が見えないのが気になるんです。
現在の処理系では検索用のヒントみたいなのは指定出来ないと言う事ですよね?少し不安です。
全体で100万件位の事実を想定しているもので。

ユニフィケーションの速度を上げたいのですが、
事実を分割して該当しそうなもののみ指定して検索させるとか可能でしょうか?
(デーブルを分割する様なイメージです)
グループ分けの規則を介する事になってかえって遅くなったりします?
2011/09/07(水) 20:17:55.44
>>252
PSI(新世代コンピュータ開発機構が開発したPrologマシン)では
確か、第一引数にハッシュでインデックスが自動付加されたように
記憶していますが、その程度のものはコンパイラにはあると思います。
しかし、全ての引数にBtreeに類するインデックスを設定できる
コンパイラはないのではないか。
254250
垢版 |
2011/09/07(水) 21:39:48.53
>>253
ありがとうございます。
とすると件数を絞れる様なものを第一引数にすると良いと言う事ですね。
考慮してみます。
2011/09/13(火) 00:06:34.91
Prologを極めることによって、ディベートに強くなれますか?
2011/09/13(火) 00:18:33.33
NO
2011/09/13(火) 00:21:14.76
Prologを極めると友達が一人もいなくなります
2011/09/13(火) 00:23:26.60
むしろPrologがお友達になります
2011/09/14(水) 01:28:33.81
Prolog極めてないのに友達がいないのですがどうすればいいですか?
2011/09/14(水) 01:36:13.38
ロンリープログラミングですね。わかりますん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況