Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2010/11/06(土) 13:00:56308デフォルトの名無しさん
2011/10/27(木) 20:52:43.37 順不同ではなくて、何の順序付けもされていない2300題から約300題
前の方から抜き取っただけで・・・ ですね。
前の方から抜き取っただけで・・・ ですね。
309デフォルトの名無しさん
2011/10/27(木) 20:56:56.62310デフォルトの名無しさん
2011/10/27(木) 21:03:23.89 仕上げのイメージは既にあって、
「英語活用大辞典」と「囲碁定石大辞典」という2つのタイプ、機能のミックスです。
1) ある述語の具体的な定義節を参照可能で
2) できるだけ多くの、出来れば公開(出版)された全てのProlog述語の定義節が網羅されて、
3) 一つのテーマ、課題をもとに詳細な変化譜を展開する
使う人がいるかどうか疑問ですが、私一代では仕上がりません。
「英語活用大辞典」と「囲碁定石大辞典」という2つのタイプ、機能のミックスです。
1) ある述語の具体的な定義節を参照可能で
2) できるだけ多くの、出来れば公開(出版)された全てのProlog述語の定義節が網羅されて、
3) 一つのテーマ、課題をもとに詳細な変化譜を展開する
使う人がいるかどうか疑問ですが、私一代では仕上がりません。
311デフォルトの名無しさん
2011/10/27(木) 21:17:24.15 >>309
それぞれに読んだ人が部分部分にコメントをつけたり誤りを指摘したり
できるから、おもしろい利用法かも知れませんね。# から始まる課題の
コピーの他に要約を付けていけばいい。ただし、私は医者や紺屋ほど
専門家ではないけど、ブログって実は使ったことがない。作ったことも。
それぞれに読んだ人が部分部分にコメントをつけたり誤りを指摘したり
できるから、おもしろい利用法かも知れませんね。# から始まる課題の
コピーの他に要約を付けていけばいい。ただし、私は医者や紺屋ほど
専門家ではないけど、ブログって実は使ったことがない。作ったことも。
312デフォルトの名無しさん
2011/10/28(金) 12:11:43.15 最近のは定石大事典かな。
以前は定石大辞典だった気がする。瀬越憲作名誉九段の監修。
以前は定石大辞典だった気がする。瀬越憲作名誉九段の監修。
313デフォルトの名無しさん
2011/10/28(金) 18:22:41.97 twitterへのPrologに関する日本語の書き込みがここのところ約一ヶ月
24時間で15~20ツイートを常に維持している。
4-5月ころは3~5平均だったから、相当の増加。外国語のツイートはさらに
爆発的で5倍どころではない。
24時間で15~20ツイートを常に維持している。
4-5月ころは3~5平均だったから、相当の増加。外国語のツイートはさらに
爆発的で5倍どころではない。
314デフォルトの名無しさん
2011/10/28(金) 18:28:01.50 なんかあったの?
315デフォルトの名無しさん
2011/10/28(金) 18:53:04.11 >>314
8月から「7つの言語 7つの世界」の影響で2倍以上の書き込みになった。
外国の事情は、よく判らないけど、似たようなことが起こっているようだ。
9月後半からの急増は相乗効果ではないか。過去の遺物といった否定的な
先入観による書き込みはほとんどなくなり、面白いという書き込みが突然
増えた。
8月から「7つの言語 7つの世界」の影響で2倍以上の書き込みになった。
外国の事情は、よく判らないけど、似たようなことが起こっているようだ。
9月後半からの急増は相乗効果ではないか。過去の遺物といった否定的な
先入観による書き込みはほとんどなくなり、面白いという書き込みが突然
増えた。
316デフォルトの名無しさん
2011/10/28(金) 19:00:13.44 難しい。わからないも多いな。
317デフォルトの名無しさん
2011/10/28(金) 19:35:17.42 よく分からんが、関数型言語への注目が集まった波及効果によって、
宣言型言語の一つである論理型言語(Prolog)にも関心が増えたのではないかと推測
あとはCoqのような実用的な定理証明系が登場して一般人向けの情報が増えた
(実用的といっても....だし、一般人といっても.....だけどね)
その結果として「論理とプログラミングとの関係」について考える人が増えたのかも
物事を形式的にモデル化するには関数だけでは足りなくて、論理も必要になるから
宣言型言語の一つである論理型言語(Prolog)にも関心が増えたのではないかと推測
あとはCoqのような実用的な定理証明系が登場して一般人向けの情報が増えた
(実用的といっても....だし、一般人といっても.....だけどね)
その結果として「論理とプログラミングとの関係」について考える人が増えたのかも
物事を形式的にモデル化するには関数だけでは足りなくて、論理も必要になるから
318デフォルトの名無しさん
2011/10/28(金) 20:06:42.91319デフォルトの名無しさん
2011/10/28(金) 20:57:19.14 そこでCurryですよ
320デフォルトの名無しさん
2011/10/28(金) 21:08:44.19 第五世代のころは世間的にはどんな扱いだったんだろう?
銀の弾丸みたいだったのかな
銀の弾丸みたいだったのかな
321デフォルトの名無しさん
2011/10/28(金) 21:28:30.72 >>320
過大評価されたし、バブル期でもあった。
Prologプログラマを派遣してもらうにはひとり120万/月とか。
ナレッジエンジニアの必須技術とされた。実はプログラマ数は
あまり増えなかったが、一応メジャー言語の末席。bit誌などの
広告ではProlog処理系が他を圧倒していた。
企業がPrologを見限って、C++に移行して急速に衰退した。
PrologでやりかたったことをC++でできるというわけではなく、
AI技術発展のお裾分けにあずかるという目論見はその時点で
挫折。
過大評価されたし、バブル期でもあった。
Prologプログラマを派遣してもらうにはひとり120万/月とか。
ナレッジエンジニアの必須技術とされた。実はプログラマ数は
あまり増えなかったが、一応メジャー言語の末席。bit誌などの
広告ではProlog処理系が他を圧倒していた。
企業がPrologを見限って、C++に移行して急速に衰退した。
PrologでやりかたったことをC++でできるというわけではなく、
AI技術発展のお裾分けにあずかるという目論見はその時点で
挫折。
322デフォルトの名無しさん
2011/10/28(金) 23:41:01.71 民主党が与党から転落するシナリオのパターンをPrologを求めて
323デフォルトの名無しさん
2011/10/29(土) 00:26:01.26 swi-prologのインタプリタをコマンドプロンプト内で実行させることはできませんか?
324デフォルトの名無しさん
2011/10/29(土) 00:29:29.96 UNIXなら swipl でインタプリタが対話モードで起動するけど....
325デフォルトの名無しさん
2011/10/29(土) 00:36:42.49326デフォルトの名無しさん
2011/10/29(土) 05:14:40.59 そういやちょっと前までplconだったよね
再インストールしたらswiplに変わってて焦った;;
再インストールしたらswiplに変わってて焦った;;
327デフォルトの名無しさん
2011/10/29(土) 13:00:09.12 http://nojiriko.asia/prolog/findmax.html
のmax/2の実装を見て、もっと簡潔に書けそうな気がしたのでチャレンジしてみました。
% max_list(_リスト, _リストの中の最大値).
max_list([_唯一の要素], _唯一の要素) :- !.
max_list([_先頭要素 | _残りのリスト], _最大値) :-
max_list(_残りのリスト, _残りのリストの最大値),
(_先頭要素 @> _残りのリストの最大値 ->
_最大値 = _先頭要素 ;
_最大値 = _残りのリストの最大値).
accumulatorを使うか使わないかの違いしかないですね…
のmax/2の実装を見て、もっと簡潔に書けそうな気がしたのでチャレンジしてみました。
% max_list(_リスト, _リストの中の最大値).
max_list([_唯一の要素], _唯一の要素) :- !.
max_list([_先頭要素 | _残りのリスト], _最大値) :-
max_list(_残りのリスト, _残りのリストの最大値),
(_先頭要素 @> _残りのリストの最大値 ->
_最大値 = _先頭要素 ;
_最大値 = _残りのリストの最大値).
accumulatorを使うか使わないかの違いしかないですね…
328デフォルトの名無しさん
2011/10/29(土) 13:02:51.49 ?- max_list([1, 30, X, 75], X).
X = 75.
ん?これでいいのか…?
X = 75.
ん?これでいいのか…?
329デフォルトの名無しさん
2011/10/29(土) 13:37:42.77 >>328
Prologの代入(単一化)とは、そういうものじゃないかと思われ
Prologの代入(単一化)とは、そういうものじゃないかと思われ
330デフォルトの名無しさん
2011/10/29(土) 14:25:17.01 >>327
要素位置番号も要求されているので一引数増えていますが、
http://nojiriko.asia/prolog/c152_883.html
の方が普通の最大値述語に近いと思います。四通り作って見ました。
要素位置番号も要求されているので一引数増えていますが、
http://nojiriko.asia/prolog/c152_883.html
の方が普通の最大値述語に近いと思います。四通り作って見ました。
331330
2011/10/29(土) 14:26:44.60 あ、5通りでした。
332デフォルトの名無しさん
2011/10/30(日) 00:29:44.58 functor/3や=..は何かに使えそうだけど、使いどころがイマイチ分からない
>>332
Lispのマクロ的な使い方や、Prologの項データを別の形式で出力する時などに便利そうですね〜
X is 2 + 3,
Y is 6 + X * 3,
write(6 + 5 * 3 = 6 + Y * 3).
Prologはこのようにちょっとした計算でも、
ゴール間の値の橋渡しの為の変数を沢山使いますよね
そこで、これを↓のようにゴール中に別のゴールを直接記述するマクロを=..で作ってみました
func_style(write(6 + 5 * 3 = ^is(**, 6 + ^is(**, 2 + 3) * 3)), X),
X.
https://gist.github.com/1325544
Lispのマクロ的な使い方や、Prologの項データを別の形式で出力する時などに便利そうですね〜
X is 2 + 3,
Y is 6 + X * 3,
write(6 + 5 * 3 = 6 + Y * 3).
Prologはこのようにちょっとした計算でも、
ゴール間の値の橋渡しの為の変数を沢山使いますよね
そこで、これを↓のようにゴール中に別のゴールを直接記述するマクロを=..で作ってみました
func_style(write(6 + 5 * 3 = ^is(**, 6 + ^is(**, 2 + 3) * 3)), X),
X.
https://gist.github.com/1325544
334デフォルトの名無しさん
2011/10/31(月) 00:52:16.75 で、prologで何ができるの?
335デフォルトの名無しさん
2011/10/31(月) 05:02:43.89336デフォルトの名無しさん
2011/10/31(月) 14:43:54.61 >>335
事務処理のバッチ処理でデータベースアクセス時間+Prologの演算時間として
後者にどれくらい許されるかということだろう。1時間だと2000万トランザクション
3時間だと5000万は超えるから、一部上場企業の95%以上クリアできると思うけど。
事務処理のバッチ処理でデータベースアクセス時間+Prologの演算時間として
後者にどれくらい許されるかということだろう。1時間だと2000万トランザクション
3時間だと5000万は超えるから、一部上場企業の95%以上クリアできると思うけど。
337デフォルトの名無しさん
2011/10/31(月) 21:47:52.41 ゲームとかも作れるの?
prologからwin32apiとかdirectxとかで画像表示もできる?
prologからwin32apiとかdirectxとかで画像表示もできる?
338デフォルトの名無しさん
2011/10/31(月) 22:47:34.81 >>337
Visual Prolog という製品(昔BorlandのTurbo Prologといった)上で開発された
ゲームというのは見たことがあるけど、激しく画面が動いていた記憶以外、ゲームには
関心がないからどういう種類のものかわからないし内容も覚えていない。
他の処理系もそれぞれグラフィックインターフェイスを謳っているようだけれど、
ゲームに適したものかどうかは知らない。
Visual Prolog という製品(昔BorlandのTurbo Prologといった)上で開発された
ゲームというのは見たことがあるけど、激しく画面が動いていた記憶以外、ゲームには
関心がないからどういう種類のものかわからないし内容も覚えていない。
他の処理系もそれぞれグラフィックインターフェイスを謳っているようだけれど、
ゲームに適したものかどうかは知らない。
339338
2011/10/31(月) 22:52:56.59 3D的な部分を計算する必要があるとすると、現在のProlog処理系では
時間がかかり過ぎて動かないはずだから、そういうことはしていないか、
別のからくりがあるのだと思う。
時間がかかり過ぎて動かないはずだから、そういうことはしていないか、
別のからくりがあるのだと思う。
340デフォルトの名無しさん
2011/11/09(水) 21:59:04.10 prologで前向き推論は出来るの?
341デフォルトの名無しさん
2011/11/09(水) 23:01:40.86 >>340
累算器を使えば可能
累算器を使えば可能
342デフォルトの名無しさん
2011/11/14(月) 05:29:23.97 TIOBE INDEX NOVEMBER http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Prologは急伸。10月は0.288 だったのが 0.353
23%上昇し、一気にHaskellを追い抜いた。
Prologは急伸。10月は0.288 だったのが 0.353
23%上昇し、一気にHaskellを追い抜いた。
343デフォルトの名無しさん
2011/11/14(月) 06:51:58.56344デフォルトの名無しさん
2011/11/14(月) 06:59:23.04 このぺースでいくと、一年位で本来の実力、0.45% 25-30位までは戻る。
そうはいかないけどねw
そうはいかないけどねw
345デフォルトの名無しさん
2011/11/14(月) 07:24:15.36 >>344
2006年5月がPrologは0.384 で25位だから、上位に新言語や対象とする言語に
加えられた言語が入ってきたから順位が落ちたと読むことができる。
それと、Prologという語はプログラム言語以外に使われるケースが増えているから、
INDEX作成時にこれをどう除去するかで、全く数字が変わってきてしまう。
ここ数ヶ月はたしかにGoogleの検索数やtwitter数が急増しているが、
最終的にはその匙加減ということになる。
2006年5月がPrologは0.384 で25位だから、上位に新言語や対象とする言語に
加えられた言語が入ってきたから順位が落ちたと読むことができる。
それと、Prologという語はプログラム言語以外に使われるケースが増えているから、
INDEX作成時にこれをどう除去するかで、全く数字が変わってきてしまう。
ここ数ヶ月はたしかにGoogleの検索数やtwitter数が急増しているが、
最終的にはその匙加減ということになる。
346デフォルトの名無しさん
2011/11/15(火) 04:34:45.80347デフォルトの名無しさん
2011/12/07(水) 06:23:03.84 あっという間に12月。TIOBE INDEXはDecemberに更新された。
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Prologは 37 -> 33位とさらに続伸。
前月のシェア 0.353 -> 0.408 に、前年同月と比較すると195%の上昇。
COBOL,VB.NET,F#を抜き去った。来月はSchemeを抜くだろう。
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Prologは 37 -> 33位とさらに続伸。
前月のシェア 0.353 -> 0.408 に、前年同月と比較すると195%の上昇。
COBOL,VB.NET,F#を抜き去った。来月はSchemeを抜くだろう。
348デフォルトの名無しさん
2011/12/07(水) 07:19:36.18 1980年代は10位以内だから、それには遠く及ばないけど、
論理型の盟主ということで、パラダイムシフトの時期には
注目されるということだろう。関数型は分散するからね。
それにしても、近い将来のErlang,Prologの20位以内揃い踏みは
確実のようだね。
論理型の盟主ということで、パラダイムシフトの時期には
注目されるということだろう。関数型は分散するからね。
それにしても、近い将来のErlang,Prologの20位以内揃い踏みは
確実のようだね。
349デフォルトの名無しさん
2011/12/07(水) 07:26:52.84350デフォルトの名無しさん
2011/12/07(水) 21:00:58.91 今週から授業がPrologに入り、来週のテストまでに仕上げてくるようにと課題を渡され
いろいろと考えてみてメソッドはこれで合っていると思うのですが、
肝心の再帰処理でのリストの作成がわからなくて詰まっています。
どなたか助けてもらえないでしょうか?
//入力と出力
?- nextItem( [146, 394, 882, 1730, 3082], N).
N = 5106
/*メソッド
146, 394, 882, 1730, 3082
248, 488, 848, 1352
240, 360, 504
120, 144
24
隣り合う数字の差分を新しいリストに出力しつづける
(248 = 394-146, 488= 882-394,...)
リストの最後まで行ったら、終了
新しいリストで繰り返し同じ処理を行う
リストの数列の長さが1になったら終了
今まで作成したリストの最後の数字をすべて足し算する。
N = 24 + 144 + 504 + 1352 + 3082
N = 5106
*/メソッド
いろいろと考えてみてメソッドはこれで合っていると思うのですが、
肝心の再帰処理でのリストの作成がわからなくて詰まっています。
どなたか助けてもらえないでしょうか?
//入力と出力
?- nextItem( [146, 394, 882, 1730, 3082], N).
N = 5106
/*メソッド
146, 394, 882, 1730, 3082
248, 488, 848, 1352
240, 360, 504
120, 144
24
隣り合う数字の差分を新しいリストに出力しつづける
(248 = 394-146, 488= 882-394,...)
リストの最後まで行ったら、終了
新しいリストで繰り返し同じ処理を行う
リストの数列の長さが1になったら終了
今まで作成したリストの最後の数字をすべて足し算する。
N = 24 + 144 + 504 + 1352 + 3082
N = 5106
*/メソッド
351350
2011/12/07(水) 21:19:01.01 組み込み関数は使わずに作成せよとのことです。
数列の最後のナンバーの取り出し方や、計算部分はなんとかなったのですが
新しいリストを作成していく方法がどうにも。
数列の最後のナンバーの取り出し方や、計算部分はなんとかなったのですが
新しいリストを作成していく方法がどうにも。
352デフォルトの名無しさん
2011/12/07(水) 23:00:04.07 組み込み関数禁止ってis/2やwrite/1も禁止なの?
next_item_0([X], [], X) :- !.
next_item_0([X1,X2|XS], [Y|YS], N) :-
Y is X2 - X1,
next_item_0([X2|XS], YS, N).
next_item([], 0 ) :- !.
next_item(XS, N1) :-
write(XS), nl,
next_item_0(XS, YS, N2),
next_item(YS, N3),
N1 is N2 + N3.
next_item_0([X], [], X) :- !.
next_item_0([X1,X2|XS], [Y|YS], N) :-
Y is X2 - X1,
next_item_0([X2|XS], YS, N).
next_item([], 0 ) :- !.
next_item(XS, N1) :-
write(XS), nl,
next_item_0(XS, YS, N2),
next_item(YS, N3),
N1 is N2 + N3.
353350
2011/12/08(木) 05:38:55.07 Write/1とis/2はさすがに大丈夫です。
nextItem_0([X1,X2|XS], [Y|YS], N),の部分で差分を別のリストに入れていくんですね。
これは自力では無理でした。
これでテスト勉強に入れます、ありがとうございました。
nextItem_0([X1,X2|XS], [Y|YS], N),の部分で差分を別のリストに入れていくんですね。
これは自力では無理でした。
これでテスト勉強に入れます、ありがとうございました。
354デフォルトの名無しさん
2011/12/08(木) 06:38:02.94 >>350
例えばということになるが、リストの要素が自然数かつ上限が決まって
いるという場合は組込述語を全く使わず定義できるが。そうでないと、
is/2あるいはlength/2は必須。
問題文をできるだけ忠実に手続き的に解釈して述語を構成すると、
http://nojiriko.asia/prolog/prolog_350_1.html
のようになるのではないか。
例えばということになるが、リストの要素が自然数かつ上限が決まって
いるという場合は組込述語を全く使わず定義できるが。そうでないと、
is/2あるいはlength/2は必須。
問題文をできるだけ忠実に手続き的に解釈して述語を構成すると、
http://nojiriko.asia/prolog/prolog_350_1.html
のようになるのではないか。
355デフォルトの名無しさん
2011/12/08(木) 06:53:05.23 >>352
next_item_0([X], [], X) :- !.
next_item_0([X1,X2|XS], [Y|YS], N) :-
↑ここにカットが無いのは何か理由があるんでしょうか?
next_item_0([X], [], X) :- !.
next_item_0([X1,X2|XS], [Y|YS], N) :-
↑ここにカットが無いのは何か理由があるんでしょうか?
356デフォルトの名無しさん
2011/12/09(金) 05:27:39.34 そこにはカット対象が存在しないと思いますが・・・間違ってたらごめんなさい
357デフォルトの名無しさん
2011/12/10(土) 08:28:41.72 この問題、素直に書けば
f [] = 0
f xs = last xs + f (diff xs)
where
diff [x] = []
diff (x1:x2:xs) = (x2-x1):diff xs
こんな感じだろうけど、prologのコードだと全体が一様で問題の構造が
みえずらいね。
f [] = 0
f xs = last xs + f (diff xs)
where
diff [x] = []
diff (x1:x2:xs) = (x2-x1):diff xs
こんな感じだろうけど、prologのコードだと全体が一様で問題の構造が
みえずらいね。
358デフォルトの名無しさん
2011/12/10(土) 13:33:08.64 Haskellだっけそれ。whereいいなぁ〜
359デフォルトの名無しさん
2011/12/10(土) 17:16:02.19 >>357
ピラミッドリストを作らなくてもよいなら、
nextItem([N],N).
nextItem(L,X) :-
append(_,[Z],L),
findall(Sub,(
append(_,[N1,N2|_],L),
Sub is N2 - N1),
L1),
nextItem(L1,Y),
X is Z + Y.
ピラミッドリストを作らなくてもよいなら、
nextItem([N],N).
nextItem(L,X) :-
append(_,[Z],L),
findall(Sub,(
append(_,[N1,N2|_],L),
Sub is N2 - N1),
L1),
nextItem(L1,Y),
X is Z + Y.
360デフォルトの名無しさん
2011/12/10(土) 17:28:25.55 Prologが代表的な関数型言語に較べて若干冗長になるのはやむを得ない。その代わり、
findall(Sub,(append(_,[N1,N2|_],L),Sub is N2 - N1),L1),
のようなコードで楽しめる。
findall(Sub,(append(_,[N1,N2|_],L),Sub is N2 - N1),L1),
のようなコードで楽しめる。
361デフォルトの名無しさん
2011/12/10(土) 18:37:08.11 そのコードのどこが楽しいか教えてくれ
362デフォルトの名無しさん
2011/12/10(土) 19:03:03.16 >>361
N1,N2が対になって左から右に移動する。そういう視覚的なところ。
N1,N2が対になって左から右に移動する。そういう視覚的なところ。
363デフォルトの名無しさん
2011/12/10(土) 21:37:06.68 冗長なのはいいけど、わかりにくいのは何とかしたいな。
人にもよると思うけど、>357と>359を比べると個人的には>357の方が
頭のスタック使用量が少なくて理解しゃすい。
人にもよると思うけど、>357と>359を比べると個人的には>357の方が
頭のスタック使用量が少なくて理解しゃすい。
364デフォルトの名無しさん
2011/12/10(土) 22:19:54.19365デフォルトの名無しさん
2011/12/10(土) 22:24:07.98 ____ ━┓
/ \ ┏┛
/ \ ,_\. ・
/ (●)゛ (●) \
| ∪ (__人__) |
/ ∩ノ ⊃ /
( \ / _ノ | |
.\ “ /__| |
\ /___ /
/ \ ┏┛
/ \ ,_\. ・
/ (●)゛ (●) \
| ∪ (__人__) |
/ ∩ノ ⊃ /
( \ / _ノ | |
.\ “ /__| |
\ /___ /
366デフォルトの名無しさん
2011/12/10(土) 22:35:49.05 うん、どうみても>359の方がわかりやすいな。
findAllも使ってるし。
findAllも使ってるし。
367デフォルトの名無しさん
2011/12/10(土) 22:38:56.29 普通findallを使ってリスト処理するときにはmember/2を使って
findall(N,(member(M,[1,2,3]),N is M + 1),L),
のようなリスト要素の取り出し方をするのだけれど、>>359のように
2要素ずつ取り出す場合にはmember/2では不可能でappend/3だと
うまくいく。一般に
?- member(A,L). と
?- append(_,[A|_],L). は同義と思われているが、appendの方がスーパーで
あることを如実に示す例ということ。
findall(N,(member(M,[1,2,3]),N is M + 1),L),
のようなリスト要素の取り出し方をするのだけれど、>>359のように
2要素ずつ取り出す場合にはmember/2では不可能でappend/3だと
うまくいく。一般に
?- member(A,L). と
?- append(_,[A|_],L). は同義と思われているが、appendの方がスーパーで
あることを如実に示す例ということ。
368デフォルトの名無しさん
2011/12/10(土) 23:52:34.14 findallによるリスト処理がよくわからん
# written in ruby
list = [1,2,3,4,5]
newlist = list.map{|e| e += 1}
// written in java
int[] list = new int[]{1,2,3,4,5};
int [] newlist = new int[list.length];
for(int i = 0; i < list.length; i++)
newlist[i] = list[i] + 1;
をfindallで書くとどうなるの?
# written in ruby
list = [1,2,3,4,5]
newlist = list.map{|e| e += 1}
// written in java
int[] list = new int[]{1,2,3,4,5};
int [] newlist = new int[list.length];
for(int i = 0; i < list.length; i++)
newlist[i] = list[i] + 1;
をfindallで書くとどうなるの?
369デフォルトの名無しさん
2011/12/11(日) 00:04:24.49 >>368
like368(List,NewList) :-
findall(N2,(member(N1,List),N2 is N1 + 1),NewList).
?- like368([1,2,3,4,5],X).
X = [2,3,4,5,6]
findall/3は第二引数が偽になるまで第二引数全体をcallする。一回真になる度に
第一引数に指定された項をリストに積んでいく。第二引数が最終的に偽になったら
リストの収集を必ず成功裏に了える。積み終わったリストは第三引数と単一化される。
like368(List,NewList) :-
findall(N2,(member(N1,List),N2 is N1 + 1),NewList).
?- like368([1,2,3,4,5],X).
X = [2,3,4,5,6]
findall/3は第二引数が偽になるまで第二引数全体をcallする。一回真になる度に
第一引数に指定された項をリストに積んでいく。第二引数が最終的に偽になったら
リストの収集を必ず成功裏に了える。積み終わったリストは第三引数と単一化される。
370デフォルトの名無しさん
2011/12/11(日) 00:12:52.32371デフォルトの名無しさん
2011/12/11(日) 00:18:42.22 >>369
ありがとうございます
memberとfindallの挙動とにらめっこしてたらだんだん分かってきました
ちなみにこれはリストの処理方法として一般的なコーディングですか?
大学の演習では習わなかった、というかrubyのArray#mapすらやり方が分からなくて困惑してました(笑
ありがとうございます
memberとfindallの挙動とにらめっこしてたらだんだん分かってきました
ちなみにこれはリストの処理方法として一般的なコーディングですか?
大学の演習では習わなかった、というかrubyのArray#mapすらやり方が分からなくて困惑してました(笑
372デフォルトの名無しさん
2011/12/11(日) 00:42:44.59373369
2011/12/11(日) 09:17:01.68 member/2を外してfindallの第二引数を定義し直してみましょう。
like368(List,NewList) :-
findall(N,add_1(List,N),NewList).
add_1([N1|_],N) :- N is N1 + 1.
add_1([_|R],N) :-
add_1(R,N).
しかし、こうなるとlike368の再帰による定義は
like368([],[]).
like368([N1|R1],[N2|R2]) :-
N2 is N1 + 1,
like368(R1,R2).
ですから、何をやってるのかわからない、ということにもなる。
つまり、何故findallによる定義を使うかですが、
memberやappendといった既存の高名な非決定性の再帰述語!!を
使ってadd_1のような定義を省略します。こうすることによって再帰定義の
繰り返しをひとつ回避してほんの僅かですが宣言性を高めようと
しているのです。
like368(List,NewList) :-
findall(N,add_1(List,N),NewList).
add_1([N1|_],N) :- N is N1 + 1.
add_1([_|R],N) :-
add_1(R,N).
しかし、こうなるとlike368の再帰による定義は
like368([],[]).
like368([N1|R1],[N2|R2]) :-
N2 is N1 + 1,
like368(R1,R2).
ですから、何をやってるのかわからない、ということにもなる。
つまり、何故findallによる定義を使うかですが、
memberやappendといった既存の高名な非決定性の再帰述語!!を
使ってadd_1のような定義を省略します。こうすることによって再帰定義の
繰り返しをひとつ回避してほんの僅かですが宣言性を高めようと
しているのです。
374デフォルトの名無しさん
2011/12/11(日) 09:43:08.70 >>373
そうではないと思う。add_1/2が非決定性の述語と定義されているから
あるいは、定義することに決めたから、findall/3が必然になったのだ。
データ構造の設計で、リストからリストへと展開することを基本とする
なら、再帰述語中心の定義になるだろうし、
Prologの基本はデータベース述語(単位節)であって本質的に非決定性で
あることは避けられないという立場からの設計なら、集約述語である
findall/3の使用は必須のものとなる。
宣言性の強弱は確かにあるが些細な差であって、より重要なことはこの
ような設計上の差異である。
そうではないと思う。add_1/2が非決定性の述語と定義されているから
あるいは、定義することに決めたから、findall/3が必然になったのだ。
データ構造の設計で、リストからリストへと展開することを基本とする
なら、再帰述語中心の定義になるだろうし、
Prologの基本はデータベース述語(単位節)であって本質的に非決定性で
あることは避けられないという立場からの設計なら、集約述語である
findall/3の使用は必須のものとなる。
宣言性の強弱は確かにあるが些細な差であって、より重要なことはこの
ような設計上の差異である。
375デフォルトの名無しさん
2011/12/11(日) 11:34:15.70 prologは非決定性を持つといえるのか?
非決定性というが、prologの場合、結果は順序まで含めて決定的。
この点ではSQLはまだ非決定性を持つが、結果を集合として考えるならやはり
決定的かな。
それと、単位節は要するに表でRDBと同じ。
その意味では、prologをprologたらしめているのは、単位節以外にあるといえる。
非決定性というが、prologの場合、結果は順序まで含めて決定的。
この点ではSQLはまだ非決定性を持つが、結果を集合として考えるならやはり
決定的かな。
それと、単位節は要するに表でRDBと同じ。
その意味では、prologをprologたらしめているのは、単位節以外にあるといえる。
376デフォルトの名無しさん
2011/12/11(日) 13:05:16.05 例えばAとBとCという概念があって,これら単体ではPrologの本質とは言えないが,
これらの概念の組み合わせ方が本質だったりする場合があるので,
そういう場合は、AやBやCという概念を持ついろんなモノをまとめて表にしていくとぼんやりと見えてくる.
メンデレーエフが周期表を発見したときのように.
これらの概念の組み合わせ方が本質だったりする場合があるので,
そういう場合は、AやBやCという概念を持ついろんなモノをまとめて表にしていくとぼんやりと見えてくる.
メンデレーエフが周期表を発見したときのように.
377デフォルトの名無しさん
2011/12/11(日) 17:39:13.48 >>375
Prologは非決定性モデルを、仕様の表に出さない決定的プロセスによって実装している
この立場に立つ人は、Prologでは、解の出現順序が決定的でなければ困るような問題を扱ってはならない
これの一番の利点はモデルを考えるとき(つまり論文を書くとき)に解を普通の集合として取り扱えること
逆に言うと、Prologの実装の決定性に依存するような問題を考えるときにはPrologの利点はなくなり、かえって実装が複雑になる
(もちろん、どんな問題であれ、解を効率的に見つけるというアルゴリズムを考えるときにはPrologの決定的な側面を厳密に考慮しなくてはならない)
Prologは非決定性モデルを、仕様の表に出さない決定的プロセスによって実装している
この立場に立つ人は、Prologでは、解の出現順序が決定的でなければ困るような問題を扱ってはならない
これの一番の利点はモデルを考えるとき(つまり論文を書くとき)に解を普通の集合として取り扱えること
逆に言うと、Prologの実装の決定性に依存するような問題を考えるときにはPrologの利点はなくなり、かえって実装が複雑になる
(もちろん、どんな問題であれ、解を効率的に見つけるというアルゴリズムを考えるときにはPrologの決定的な側面を厳密に考慮しなくてはならない)
378デフォルトの名無しさん
2011/12/11(日) 20:01:37.69 prologの言語仕様は、解の出現順序を決定的に定義してたと思う。
ISOの規格文書が見つからないので引用できないけど。
ISOの規格文書が見つからないので引用できないけど。
379デフォルトの名無しさん
2011/12/11(日) 20:13:59.14 ISOのWebサイトは見づらすぎるね
こちとらAdobe Readerなんてはいってないんだよ
こちとらAdobe Readerなんてはいってないんだよ
380379
2011/12/11(日) 20:15:03.51 ごめん入出力はISOなのに脳みそはJISと認識してたわ
381デフォルトの名無しさん
2011/12/12(月) 06:57:02.61 >>375
Prologの単位節はもうこれ以上、書き換えることのない、どん詰まりの情報だ。
中島秀之氏はこれをプリミティブなものと表現したが。
RDBは列ごとに集合を表すが、Prologの単位節の引数にそういった意味合いは
まったくない。あくまでRDBに模して(RDBとの親和性といった)、引数部分に情報
を配置することが可能というだけ。
Prologのプログラムとはこのどん詰まりに導くためにルールが書かれていると
解釈できるのであって、どちらがPrologの根幹かなどと問うこと自体無意味だ。
Prologの単位節はもうこれ以上、書き換えることのない、どん詰まりの情報だ。
中島秀之氏はこれをプリミティブなものと表現したが。
RDBは列ごとに集合を表すが、Prologの単位節の引数にそういった意味合いは
まったくない。あくまでRDBに模して(RDBとの親和性といった)、引数部分に情報
を配置することが可能というだけ。
Prologのプログラムとはこのどん詰まりに導くためにルールが書かれていると
解釈できるのであって、どちらがPrologの根幹かなどと問うこと自体無意味だ。
382デフォルトの名無しさん
2011/12/12(月) 07:03:09.67 RDBの正規化もどん詰まりの情報では?
意味合いを持たせる持たせないの話なら使い手次第では?
意味合いを持たせる持たせないの話なら使い手次第では?
383デフォルトの名無しさん
2011/12/12(月) 07:26:04.30384デフォルトの名無しさん
2011/12/12(月) 07:43:31.73 >>381
どちらにというとそうだけど、帰納論理プログラミングなんかは、
明らかに具体的な情報を基礎にルールを見つけて組み立てるという
方向のアプローチですね。そういう方向性のようなものは個々の
Prologプログラマの中にもあるということではないか。Prologを
証明器として捉える人は、ルール重視になるだろうし。
どちらにというとそうだけど、帰納論理プログラミングなんかは、
明らかに具体的な情報を基礎にルールを見つけて組み立てるという
方向のアプローチですね。そういう方向性のようなものは個々の
Prologプログラマの中にもあるということではないか。Prologを
証明器として捉える人は、ルール重視になるだろうし。
385デフォルトの名無しさん
2011/12/12(月) 08:13:19.07 prologをデータベース代わりに使う人は
単位節を主として、ルールを副と考えるよね。
このスレには昔から「prologの根幹は単位節」と唱える人がいるみたいだし。
それはprologの、ではなくデータベースの根幹だといつも思う。
単位節を主として、ルールを副と考えるよね。
このスレには昔から「prologの根幹は単位節」と唱える人がいるみたいだし。
それはprologの、ではなくデータベースの根幹だといつも思う。
386デフォルトの名無しさん
2011/12/12(月) 08:55:46.872011/12/12(月) 09:01:39.56
>>386
ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。
ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。
389デフォルトの名無しさん
2011/12/12(月) 09:28:02.13 内包と外延が近い表記法でバランスよくプログラムに記述できる
ところがPrologの大きな魅力だ、というくらいでいいんじゃないか。
ところがPrologの大きな魅力だ、というくらいでいいんじゃないか。
390デフォルトの名無しさん
2011/12/12(月) 12:59:25.07 よく分からない。
ボディがtrueのルールがファクトなのでしょう?
ルールはファクトを包含しているのでしょう?
なら節は全てルールだけと言えるでしょう?
仮にファクトだけで成立するならそれは命題論理であって、一階述語論理ではない、つまりPrologではない。
ボディがtrueのルールがファクトなのでしょう?
ルールはファクトを包含しているのでしょう?
なら節は全てルールだけと言えるでしょう?
仮にファクトだけで成立するならそれは命題論理であって、一階述語論理ではない、つまりPrologではない。
391デフォルトの名無しさん
2011/12/12(月) 16:09:09.71392デフォルトの名無しさん
2011/12/12(月) 16:33:00.97 >>375
棄て去った解候補の順序が決まっているかどうかなんて関係あるかな。
棄て去った解候補の順序が決まっているかどうかなんて関係あるかな。
393デフォルトの名無しさん
2011/12/14(水) 15:55:43.43 Prolog Cafe 1.2.5で
| ?- frend(taro,hanako).
{EXISTENCE ERROR: procedure frend/2 does not exist}
| ?-
などといわれます。このエラーは何ですか?
| ?- frend(taro,hanako).
{EXISTENCE ERROR: procedure frend/2 does not exist}
| ?-
などといわれます。このエラーは何ですか?
394デフォルトの名無しさん
2011/12/14(水) 19:29:31.30 >>393
節データベースにfriend/2が存在しないという意味。
assert(frend(taro,hanako)).
と入力すれば節データベースに追加される。
確認するには、
listing.
と入力する。
assertせずにソースファイルから節データベースに読み込む場合は、
['hogehoge.pl'].
と入力する。
節データベースにfriend/2が存在しないという意味。
assert(frend(taro,hanako)).
と入力すれば節データベースに追加される。
確認するには、
listing.
と入力する。
assertせずにソースファイルから節データベースに読み込む場合は、
['hogehoge.pl'].
と入力する。
395デフォルトの名無しさん
2011/12/15(木) 07:59:20.08396デフォルトの名無しさん
2011/12/21(水) 11:28:06.93 データが基礎であり、則ちデータベースが基礎である。 そのデータベースを最も自然体で保持できるプログラム言語は Prologである。これだけで十分で、特に単位節がPrologの基本 などと云う必要もない。
397デフォルトの名無しさん
2011/12/23(金) 00:30:36.61 Prologは関係データベースと演繹データベースの派生として解釈できる
しかし、Prologはデータベースが基礎であるというのは言い過ぎ
理由は、永続的に記録できるデータはソースファイルに書いた分だけで、稼働中に追加されたデータはただちに消えるか、Prologの仕様にない方法で記録するしかないから
Prologをデータベースというのなら、C言語もデータベースということになる
C言語の方はさらに表現能力が高い演繹データベースということになる
しかし、Prologはデータベースが基礎であるというのは言い過ぎ
理由は、永続的に記録できるデータはソースファイルに書いた分だけで、稼働中に追加されたデータはただちに消えるか、Prologの仕様にない方法で記録するしかないから
Prologをデータベースというのなら、C言語もデータベースということになる
C言語の方はさらに表現能力が高い演繹データベースということになる
398デフォルトの名無しさん
2011/12/23(金) 05:14:48.50 >>397
Prologをオンメモリデータベースシステムとして捉えたら欠点だらけと
いうことになる。ここでも指摘されているが、assertzが無闇と遅く、
初期状態の回復に時間がかかる。節順序を指定してのUPDATEが
できない、等。しかし、現実にはそれを補強しながら使われている。
Prologのデータベースや単位節を強調した話題は、全部態度表明。
オブジェクト指向の初期に差分プログラミングが強調されたようなレベル。
Prologをオンメモリデータベースシステムとして捉えたら欠点だらけと
いうことになる。ここでも指摘されているが、assertzが無闇と遅く、
初期状態の回復に時間がかかる。節順序を指定してのUPDATEが
できない、等。しかし、現実にはそれを補強しながら使われている。
Prologのデータベースや単位節を強調した話題は、全部態度表明。
オブジェクト指向の初期に差分プログラミングが強調されたようなレベル。
399デフォルトの名無しさん
2011/12/23(金) 07:12:56.08 >>397 Prologデータベースについては、単一レベル記憶的なイメージの 実現を夢見るのが一番ハッピーなのではないか。あまり永続性に 拘るのもいかがなものか。その昔、コアメモリなんてものもあった。
400デフォルトの名無しさん
2011/12/23(金) 16:21:20.36 停電したらどうしようという話でしょ。
401デフォルトの名無しさん
2011/12/23(金) 16:27:24.34 なんか話がループしてるような気がする。
暇なひとはマインドマップでも書いて見ると良い。
もちえん枝葉にはそれぞれ議論があるだろからきれいな図にはならず、
きっと面倒だろう。
暇なひとはマインドマップでも書いて見ると良い。
もちえん枝葉にはそれぞれ議論があるだろからきれいな図にはならず、
きっと面倒だろう。
402デフォルトの名無しさん
2011/12/23(金) 17:15:31.47 >>400
データベースとして使う時はPrologサーバーとして使うから、
トランザクションの度に子プロセスを生成して、そこにコピーが
できるわけだから、保存ファイルにlistingするのではないかな。
データベースとして使う時はPrologサーバーとして使うから、
トランザクションの度に子プロセスを生成して、そこにコピーが
できるわけだから、保存ファイルにlistingするのではないかな。
403デフォルトの名無しさん
2011/12/24(土) 14:13:21.25 Prologをデータベースとしてとらえたときに、特に優れている点は、複数の関係のJoinしたときのパターンマッチングの速度の速さ
特に劣っている点がデータの更新と永続性
特に劣っている点がデータの更新と永続性
404デフォルトの名無しさん
2011/12/24(土) 17:32:27.27 節の定義順を維持しようとすると、全ての節を一度retractしなくては
ならない。ここらあたりの基本動作は改変しないと本格的なデータベースには
使えない。
最低限、節の定義位置の相対番号によりretract/assert指定は可能にする
必要がある。
ならない。ここらあたりの基本動作は改変しないと本格的なデータベースには
使えない。
最低限、節の定義位置の相対番号によりretract/assert指定は可能にする
必要がある。
405デフォルトの名無しさん
2011/12/24(土) 17:39:41.47 それから、永続性の問題の方は、オンメモリデータベース共通の問題だが、
停止したあとの再現が確実に行われる必要がある。現在はこれに使用する
ユーティリティの作成から全てをエンドユーザ任せの水準だが、Prolog処理系が
安全で安定した動作/環境を保証する必要がある。
停止したあとの再現が確実に行われる必要がある。現在はこれに使用する
ユーティリティの作成から全てをエンドユーザ任せの水準だが、Prolog処理系が
安全で安定した動作/環境を保証する必要がある。
406デフォルトの名無しさん
2011/12/24(土) 22:41:14.94407デフォルトの名無しさん
2011/12/25(日) 00:47:56.96 >>406
正確には、演繹データベースの中ではPrologはボディ部のマッチングが特に速く、適切なホーン説が存在すればあればJoinが関係データベースよりも速くなる
r(X,Y) and s(Y,Z) and t(Z)
という結合を考えるとき、Oracleみたいな関係データベースは、rとsとtの全タプルの全組み合わせを生成する
一方Prologでは、例えば
s(Y, "test") :- s(Y,Z),t(Z)
みたいなホーン節があれば前述の結合は、rとsだけの結合の組み合わせさえ生成すればよくなる
Prologは演繹データベースの中でも本体部分のマッチングがかなり高速なので、適当なホーン説があれば関係データベースを含む他のデータベースのjoinよりもPrologのjoinは速い
Prologをデータベースとして利用するときには、データを定期的に走査して、データマイニング技術により、テーブル間の自然結合を高速にするホーン説をストックしている
(逆にいうと、データを頻繁に更新するときにはこの利点はまったくなくなる)
正確には、演繹データベースの中ではPrologはボディ部のマッチングが特に速く、適切なホーン説が存在すればあればJoinが関係データベースよりも速くなる
r(X,Y) and s(Y,Z) and t(Z)
という結合を考えるとき、Oracleみたいな関係データベースは、rとsとtの全タプルの全組み合わせを生成する
一方Prologでは、例えば
s(Y, "test") :- s(Y,Z),t(Z)
みたいなホーン節があれば前述の結合は、rとsだけの結合の組み合わせさえ生成すればよくなる
Prologは演繹データベースの中でも本体部分のマッチングがかなり高速なので、適当なホーン説があれば関係データベースを含む他のデータベースのjoinよりもPrologのjoinは速い
Prologをデータベースとして利用するときには、データを定期的に走査して、データマイニング技術により、テーブル間の自然結合を高速にするホーン説をストックしている
(逆にいうと、データを頻繁に更新するときにはこの利点はまったくなくなる)
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★2 [蚤の市★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 [蚤の市★]
- 【ド軍】山本由伸、WBC出場を決断!ドジャースが本人の意向を尊重、佐々木朗希はチームが故障歴を懸念で不参加 [鉄チーズ烏★]
- 米大統領報道官「日本と強固な同盟維持、中国とも協力」 [少考さん★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ ★2 [蚤の市★]
- 【テレビ】粗品「THE W」バッサリ「おもんない、レベル低い」審査員就任で「日テレが“血の海”に…」 [湛然★]
- 女も昔は精子だったんだな
- 【未確認生ハメ情報】安倍晋三が高市早苗氏とチョメチョメしていたという噂が囁かれる。 [928194223]
- 【画像】地方局の女子アナさん、朝からエッチなおパンツを全国放送されてしまう😍
- 最近朝に暇だからラヴィット!見てるけど(´・ω・`)
- 【悲報】女さん「ハローワークで仕事を探してる3-40代の中年男性いるでしょ。あれ何?」 [483447288]
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
