Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2010/11/06(土) 13:00:56244デフォルトの名無しさん
2011/07/14(木) 14:41:46.26245デフォルトの名無しさん
2011/07/15(金) 03:23:58.99246デフォルトの名無しさん
2011/07/15(金) 05:33:59.23 >>240
http://nojiriko.asia/prolog/c135_256.html
AZ-Prolog処理系作者によって書かれたMPIライクな
マルチプロセス並列処理機能の使用プログラム。
http://nojiriko.asia/prolog/c135_256.html
AZ-Prolog処理系作者によって書かれたMPIライクな
マルチプロセス並列処理機能の使用プログラム。
247デフォルトの名無しさん
2011/08/21(日) 10:38:06.34 JVM上で動作し、Javaからも呼び出し可能なprologがあれば!
248デフォルトの名無しさん
2011/08/22(月) 09:38:53.46 prolog cafeがありますよ
249デフォルトの名無しさん
2011/08/22(月) 15:03:23.52250デフォルトの名無しさん
2011/09/07(水) 11:51:09.81 完全な素人です。素朴な疑問なのですが、
同じ事をする場合、手続き的言語と比べて明らかに効率が悪くなる処理とかありますか?
例えばユニフィケーションって処理的にかなり重い気がします。
他にも配列と比べるとリストでは先頭の値しか扱えないとか、再帰呼び出しで
(一つ減らして)全要素を毎回コピーするとか手続き型の先入観を持ってると
効率が悪い気がするのですが、理屈の上では処理が増えるとか言う事は無いのでしょうか?
記憶領域もN^2/2とか必要になりそうですし。
ユニフィケーションのコストってどの位と見積もれるものでしょうか?
事実の数が10倍になると10倍の処理が必要なのですか?
それともSQLのインデックスみたいな事、もしくはキャッシュみたいなものを持っていて
それ程増えないのでしょうか?
変な事を書いているかも知れませんので、疑問自体がおかしいみたいな指摘でも結構です。
よろしくお願いします。
同じ事をする場合、手続き的言語と比べて明らかに効率が悪くなる処理とかありますか?
例えばユニフィケーションって処理的にかなり重い気がします。
他にも配列と比べるとリストでは先頭の値しか扱えないとか、再帰呼び出しで
(一つ減らして)全要素を毎回コピーするとか手続き型の先入観を持ってると
効率が悪い気がするのですが、理屈の上では処理が増えるとか言う事は無いのでしょうか?
記憶領域もN^2/2とか必要になりそうですし。
ユニフィケーションのコストってどの位と見積もれるものでしょうか?
事実の数が10倍になると10倍の処理が必要なのですか?
それともSQLのインデックスみたいな事、もしくはキャッシュみたいなものを持っていて
それ程増えないのでしょうか?
変な事を書いているかも知れませんので、疑問自体がおかしいみたいな指摘でも結構です。
よろしくお願いします。
251デフォルトの名無しさん
2011/09/07(水) 18:21:14.48 >>250
Prologは最も速いコンパイラ言語の100倍以上遅いでしょう。
その理由の過半がユニフィケーションと変数の繰り返し出現検査に
あると思います。指摘されたように配列がないこともある場合には
原因となります。それに比べればトレイルスタック等の追加的処理は
大きなコストになっていないはずです。
明らかに遅くて使えないのはビットマップの処理ですね。繰り返し
数百万のビットに対して演算する場合です。RPGも無理でしょう。
Prologはオンメモリデータベースですから、そこそこ速いのですが、
Prologが再起するためには、あなたが指摘したとおり、インデックス
などによる最適化によって、定義アトムを検索する能力を高める
必要があると思います。現在のレベルでは、数百万節の検索を
掛ける気になりません。
Prologは最も速いコンパイラ言語の100倍以上遅いでしょう。
その理由の過半がユニフィケーションと変数の繰り返し出現検査に
あると思います。指摘されたように配列がないこともある場合には
原因となります。それに比べればトレイルスタック等の追加的処理は
大きなコストになっていないはずです。
明らかに遅くて使えないのはビットマップの処理ですね。繰り返し
数百万のビットに対して演算する場合です。RPGも無理でしょう。
Prologはオンメモリデータベースですから、そこそこ速いのですが、
Prologが再起するためには、あなたが指摘したとおり、インデックス
などによる最適化によって、定義アトムを検索する能力を高める
必要があると思います。現在のレベルでは、数百万節の検索を
掛ける気になりません。
252250
2011/09/07(水) 19:29:25.63 >>251
丁寧な回答ありがとうございます。
確かにエンコードなんかで大量のデータをランダムに走査するとか不得意そうですね。
100倍程度なら何とか許容出来るのかもしれません。
ただ、ユニフィケーションの実際の動作が見えないのが気になるんです。
現在の処理系では検索用のヒントみたいなのは指定出来ないと言う事ですよね?少し不安です。
全体で100万件位の事実を想定しているもので。
ユニフィケーションの速度を上げたいのですが、
事実を分割して該当しそうなもののみ指定して検索させるとか可能でしょうか?
(デーブルを分割する様なイメージです)
グループ分けの規則を介する事になってかえって遅くなったりします?
丁寧な回答ありがとうございます。
確かにエンコードなんかで大量のデータをランダムに走査するとか不得意そうですね。
100倍程度なら何とか許容出来るのかもしれません。
ただ、ユニフィケーションの実際の動作が見えないのが気になるんです。
現在の処理系では検索用のヒントみたいなのは指定出来ないと言う事ですよね?少し不安です。
全体で100万件位の事実を想定しているもので。
ユニフィケーションの速度を上げたいのですが、
事実を分割して該当しそうなもののみ指定して検索させるとか可能でしょうか?
(デーブルを分割する様なイメージです)
グループ分けの規則を介する事になってかえって遅くなったりします?
253デフォルトの名無しさん
2011/09/07(水) 20:17:55.44 >>252
PSI(新世代コンピュータ開発機構が開発したPrologマシン)では
確か、第一引数にハッシュでインデックスが自動付加されたように
記憶していますが、その程度のものはコンパイラにはあると思います。
しかし、全ての引数にBtreeに類するインデックスを設定できる
コンパイラはないのではないか。
PSI(新世代コンピュータ開発機構が開発したPrologマシン)では
確か、第一引数にハッシュでインデックスが自動付加されたように
記憶していますが、その程度のものはコンパイラにはあると思います。
しかし、全ての引数にBtreeに類するインデックスを設定できる
コンパイラはないのではないか。
254250
2011/09/07(水) 21:39:48.53255デフォルトの名無しさん
2011/09/13(火) 00:06:34.91 Prologを極めることによって、ディベートに強くなれますか?
256デフォルトの名無しさん
2011/09/13(火) 00:18:33.33 NO
257デフォルトの名無しさん
2011/09/13(火) 00:21:14.76 Prologを極めると友達が一人もいなくなります
258デフォルトの名無しさん
2011/09/13(火) 00:23:26.60 むしろPrologがお友達になります
259デフォルトの名無しさん
2011/09/14(水) 01:28:33.81 Prolog極めてないのに友達がいないのですがどうすればいいですか?
260デフォルトの名無しさん
2011/09/14(水) 01:36:13.38 ロンリープログラミングですね。わかりますん
261デフォルトの名無しさん
2011/09/20(火) 07:51:09.68262デフォルトの名無しさん
2011/09/20(火) 08:03:20.00 最近、うちの子がパソコンを眺めて「ともだち…ともだち…ウヘ」と独り言ちているのですが、どうしたらいいでしょうか。
263デフォルトの名無しさん
2011/09/20(火) 11:25:37.87 友達を蹴ったり、食べたりしないように注意しとけ
264デフォルトの名無しさん
2011/10/06(木) 20:49:10.98 すげー今更だけど、
>>70
あたりで定義してる get_line って、
きょうびのProlog処理系だとこんな感じでいいと思う
get_line(Line):-
findall(C,(
repeat,
get_char(C),
(C=='\r' -> fail
;C=='\n' -> !,fail
;true)
),Chars),
atom_chars(Line,Chars).
あんまり論理プログラミングっぽくはないが
>>70
あたりで定義してる get_line って、
きょうびのProlog処理系だとこんな感じでいいと思う
get_line(Line):-
findall(C,(
repeat,
get_char(C),
(C=='\r' -> fail
;C=='\n' -> !,fail
;true)
),Chars),
atom_chars(Line,Chars).
あんまり論理プログラミングっぽくはないが
265264
2011/10/06(木) 21:07:32.12 あと、ストリーム指定付きを作るなら、ストリーム指定付きを定義して、
ストリーム指定なしから呼び出すようにしたほうががスマート
get_line(Line):- current_input(Stream), get_line(Stream,Line).
get_line(Stream,Line):-
〜〜
get_char(Stream,C),
〜〜
current_input/1 が無ければ seeing/1 でも使うべし
ストリーム指定なしから呼び出すようにしたほうががスマート
get_line(Line):- current_input(Stream), get_line(Stream,Line).
get_line(Stream,Line):-
〜〜
get_char(Stream,C),
〜〜
current_input/1 が無ければ seeing/1 でも使うべし
266デフォルトの名無しさん
2011/10/07(金) 20:59:08.63 '\r'消しちゃうのはまずいような・・・
get_line(Line) :-
findall(C, (
repeat,
get_char(C),
(C = '\n', !, fail; true)), X),
(append(Y, ['\r'], X), !; Y = X), atom_chars(Line, Y).
get_line(Line) :-
findall(C, (
repeat,
get_char(C),
(C = '\n', !, fail; true)), X),
(append(Y, ['\r'], X), !; Y = X), atom_chars(Line, Y).
267264
2011/10/09(日) 21:23:06.10 >>266
標準入力かファイルからの入力で、一行読むとき、
キャリッジリターンが行中に出てくるシチュ、
それからもし出てきたとしてそれを生かしておく意味、
というのが想像つかないので、解説よろしくお願いしますっ
標準入力かファイルからの入力で、一行読むとき、
キャリッジリターンが行中に出てくるシチュ、
それからもし出てきたとしてそれを生かしておく意味、
というのが想像つかないので、解説よろしくお願いしますっ
268デフォルトの名無しさん
2011/10/10(月) 09:24:01.55 個人的に意味のない良いケースだから!って言って、
内容を勝手に改変しちゃうような処理に一般的な名前を付けちゃうのはどうかと思いますっ!
get_line_without_CRとでもしてはどうでしょうかっ
内容を勝手に改変しちゃうような処理に一般的な名前を付けちゃうのはどうかと思いますっ!
get_line_without_CRとでもしてはどうでしょうかっ
269デフォルトの名無しさん
2011/10/10(月) 11:24:47.45 >>268
ISO標準になっていないこのような定義は、どんなものを標準的なライブラリに
加えればよいか、まだ手探りの状態ですから、このような細かな点を議論する
ことに意義があると思います。できるだけ、細部を反映するような述語名を
与えるべしとするのは卓見だと思います。
ISO標準になっていないこのような定義は、どんなものを標準的なライブラリに
加えればよいか、まだ手探りの状態ですから、このような細かな点を議論する
ことに意義があると思います。できるだけ、細部を反映するような述語名を
与えるべしとするのは卓見だと思います。
270264
2011/10/10(月) 18:46:18.46 なんかノリが変だ・・・
本当に、何か見落としがあるなら教えて欲しかったし、
煽ったつもりはなかったんだけど
自分のコードは、>>73 で追加されたCR無視などを参考に、
書き方を変えただけのものなのだが、
ちゃんと 'end_of_file' を扱っていないとかアウトだ・・・ゴメン
もし入出力として一般化したいなら、
一文字入力の時に改行コードがどうなるかの標準に照らして書く、
の一点だと思う。
が、標準がある項目についても沿っていない処理系も多いPrologなので、
現状、挙動にあわせて処理を書くしかないのでは?
そうなると、単体CRを改行扱いした方がいい環境や、
単体LFを改行扱いしてはいけない環境もありそうだが
本当に、何か見落としがあるなら教えて欲しかったし、
煽ったつもりはなかったんだけど
自分のコードは、>>73 で追加されたCR無視などを参考に、
書き方を変えただけのものなのだが、
ちゃんと 'end_of_file' を扱っていないとかアウトだ・・・ゴメン
もし入出力として一般化したいなら、
一文字入力の時に改行コードがどうなるかの標準に照らして書く、
の一点だと思う。
が、標準がある項目についても沿っていない処理系も多いPrologなので、
現状、挙動にあわせて処理を書くしかないのでは?
そうなると、単体CRを改行扱いした方がいい環境や、
単体LFを改行扱いしてはいけない環境もありそうだが
271264
2011/10/10(月) 18:48:13.44 >どんなものを標準的なライブラリに加えればよいか
なんて議論の、末端にいる気持ちすらなかったし、
名前に拘りがある訳でももちろんなく、
get_line_without_CR は確かに実態に則した名前だと思うので、
そのような名前が必要な場合には各場で命名すればいいと思う。
ああ、必死だな、おれ
めっちゃ恥ずかしい
Prolog初心者スレって敷居高いな・・・
しばらくROMってます
なんて議論の、末端にいる気持ちすらなかったし、
名前に拘りがある訳でももちろんなく、
get_line_without_CR は確かに実態に則した名前だと思うので、
そのような名前が必要な場合には各場で命名すればいいと思う。
ああ、必死だな、おれ
めっちゃ恥ずかしい
Prolog初心者スレって敷居高いな・・・
しばらくROMってます
272264=270
2011/10/10(月) 18:57:55.89 ROMってるとか言ってさっそくだけど、一文抜けてたので。
>現状、挙動にあわせて処理を書くしかないのでは?
という段落の次に、
「だから俺自身は、実務上必要そうな実装の雛形の一提案をしたつもりでしかなかったので」
を挟んで、
>>どんなものを標準的なライブラリに加えればよいか
>なんて議論の、末端にいる気持ちすらなかったし、
に続くつもり。
なんだか意味のない煽りにしか見えなかったのが、
言い訳がましく見えるようになる一文を加えさせていただいて、さようなら
>現状、挙動にあわせて処理を書くしかないのでは?
という段落の次に、
「だから俺自身は、実務上必要そうな実装の雛形の一提案をしたつもりでしかなかったので」
を挟んで、
>>どんなものを標準的なライブラリに加えればよいか
>なんて議論の、末端にいる気持ちすらなかったし、
に続くつもり。
なんだか意味のない煽りにしか見えなかったのが、
言い訳がましく見えるようになる一文を加えさせていただいて、さようなら
273デフォルトの名無しさん
2011/10/12(水) 10:53:53.39 '\n'か'\r'か'\r\n'という問題は、環境にあまりに依存するから、現在のところ、改行は'\n'のみ、
'\r'は一応アルファベット扱いするしかないと思う。
なぜかというと、
?- ・・・concat_atom([_行1,_行2,_行3],_区切り文字,_ファイル全体の文字列),
というような処理は日常的に存在する。完全に復元するには、行に分解した際の
改行コードがなんであったかをファイルごとに出力モード引数で取得して
保存しておかなくてはならないが、これはあまりにも煩雑。
行の中に'\r'や'\n'を含めるのは実務的にさらに不可。ということになります。
'\r'は一応アルファベット扱いするしかないと思う。
なぜかというと、
?- ・・・concat_atom([_行1,_行2,_行3],_区切り文字,_ファイル全体の文字列),
というような処理は日常的に存在する。完全に復元するには、行に分解した際の
改行コードがなんであったかをファイルごとに出力モード引数で取得して
保存しておかなくてはならないが、これはあまりにも煩雑。
行の中に'\r'や'\n'を含めるのは実務的にさらに不可。ということになります。
274デフォルトの名無しさん
2011/10/18(火) 23:18:23.05 単純な好奇心なんだが、prologでクイックソートってどう書くの?
275デフォルトの名無しさん
2011/10/18(火) 23:39:33.53 Wikipediaのプログラム例にあるよ
276デフォルトの名無しさん
2011/10/19(水) 00:07:32.26 wikipediaとかしばらく見てなかった・・・
ありがとう
見てくる
ありがとう
見てくる
277デフォルトの名無しさん
2011/10/19(水) 00:24:36.08 haskellのリスト内包表記に相当する部分で複雑に見えてしまってますね・・・
(たぶん、リスト内包表記使わない方法だと同じくらいのコード量)
prologにはリスト内包表記に相当するものは無いのでしょうか?
(たぶん、リスト内包表記使わない方法だと同じくらいのコード量)
prologにはリスト内包表記に相当するものは無いのでしょうか?
findall使えばWikipediaのやつよりはHaskellっぽくなるかも(´・ω・`)こんな感じ
quicksort([], []).
quicksort([H|T], Sorted) :-
findall(E, (member(E, T), E @> H), GTs),
findall(E, (member(E, T), E @=< H), LEs),
quicksort(GTs, GTs2),
quicksort(LEs, LEs2),
append(LEs2, [H|GTs2], Sorted).
quicksort([], []).
quicksort([H|T], Sorted) :-
findall(E, (member(E, T), E @> H), GTs),
findall(E, (member(E, T), E @=< H), LEs),
quicksort(GTs, GTs2),
quicksort(LEs, LEs2),
append(LEs2, [H|GTs2], Sorted).
279デフォルトの名無しさん
2011/10/19(水) 06:47:22.49280デフォルトの名無しさん
2011/10/22(土) 13:46:29.58 ええー、どう見たって関数型言語のほうがコードがシンプルじゃん…
281デフォルトの名無しさん
2011/10/22(土) 14:02:35.00 >>280
partitionで分解する所がPrologの値打ちなんでね。
partitionで分解する所がPrologの値打ちなんでね。
282デフォルトの名無しさん
2011/10/22(土) 16:30:19.49283デフォルトの名無しさん
2011/10/22(土) 16:47:53.03284デフォルトの名無しさん
2011/10/22(土) 18:15:36.25285デフォルトの名無しさん
2011/10/22(土) 23:23:48.25 このfor/3を実装するのに、結構試行錯誤したわ
http://www.ifcomputer.com/IFProlog/Manuals/v4.1/reference/for/home_en.html
Prologって全然直感的じゃないな
http://www.ifcomputer.com/IFProlog/Manuals/v4.1/reference/for/home_en.html
Prologって全然直感的じゃないな
286デフォルトの名無しさん
2011/10/22(土) 23:51:13.94 >>285
これはC言語等の下劣な仕様に阿っているのが悪いのであって、
第二引数と第三引数を交換するだけで、
(分かりやすくするため 最終値 >= 初期値 のケースだけにする)
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式 > _最終値_式,!,fail.
for(_初期値_式,_最終値_式, _カウンタ) :-
_カウンタ is _初期値_式.
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式_2 is _初期値_式 + 1,
for(_初期値_式_2,_最終値_式, _カウンタ).
当たり前のPrologの述語となる。強いてちょっと
気持ち悪いのは第一節の !,fail. くらい。
これはC言語等の下劣な仕様に阿っているのが悪いのであって、
第二引数と第三引数を交換するだけで、
(分かりやすくするため 最終値 >= 初期値 のケースだけにする)
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式 > _最終値_式,!,fail.
for(_初期値_式,_最終値_式, _カウンタ) :-
_カウンタ is _初期値_式.
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式_2 is _初期値_式 + 1,
for(_初期値_式_2,_最終値_式, _カウンタ).
当たり前のPrologの述語となる。強いてちょっと
気持ち悪いのは第一節の !,fail. くらい。
287デフォルトの名無しさん
2011/10/22(土) 23:59:17.38288286
2011/10/23(日) 00:10:58.32 一般にPrologでは
foo(S,E,X) :- の形式をとり、
Sはカウンタ、X でそれを取り出す。
Eは限界値を示す。
これで数値カウンタループ述語を構成する。
for/3は
repeat.
repeat :- repeat.
のrepeatパターンの述語。
member/2やappend/3もこのパターン。
どれも非決定性述語である。
member(A,[A|_]).
member(A,[_|R]) :- member(A,R).
append([],L,L).
append([U|X],Y,[U|Z]) :- append(X,Y,Z).
?- append(_,_,_), ・・・ とするとrepeatと同じ機能となる。
(ただし繰り返しが多くなるとスタックオーバーフローが起きるかも知れない)
foo(S,E,X) :- の形式をとり、
Sはカウンタ、X でそれを取り出す。
Eは限界値を示す。
これで数値カウンタループ述語を構成する。
for/3は
repeat.
repeat :- repeat.
のrepeatパターンの述語。
member/2やappend/3もこのパターン。
どれも非決定性述語である。
member(A,[A|_]).
member(A,[_|R]) :- member(A,R).
append([],L,L).
append([U|X],Y,[U|Z]) :- append(X,Y,Z).
?- append(_,_,_), ・・・ とするとrepeatと同じ機能となる。
(ただし繰り返しが多くなるとスタックオーバーフローが起きるかも知れない)
290デフォルトの名無しさん
2011/10/23(日) 00:14:27.91 ありがちなミス
for(Lower,X,Upper) :-
Lower = X ; for(Lower+1,X,Upper).
for(Lower,X,Upper) :-
Lower = X ; for(Lower+1,X,Upper).
291デフォルトの名無しさん
2011/10/23(日) 00:19:43.74292デフォルトの名無しさん
2011/10/23(日) 00:30:08.03 >>291
立派なコードだと思うけど。
立派なコードだと思うけど。
293デフォルトの名無しさん
2011/10/23(日) 03:56:31.01294デフォルトの名無しさん
2011/10/23(日) 04:32:16.76 >>293
ここでやってるforはCやJavaのforとは無関係で、Haskellの[from..to]みたいなもの。
処理は、
for(L,X,H), do(X,C).
みたいに書いて、最後にfailさせるかメタ述語で全解生成する。
Haskellなら[ do x | x <- [from..to]]だね。
ここでやってるforはCやJavaのforとは無関係で、Haskellの[from..to]みたいなもの。
処理は、
for(L,X,H), do(X,C).
みたいに書いて、最後にfailさせるかメタ述語で全解生成する。
Haskellなら[ do x | x <- [from..to]]だね。
295デフォルトの名無しさん
2011/10/23(日) 04:51:07.54296デフォルトの名無しさん
2011/10/23(日) 07:21:02.39 >>293
数値を順に生成するもの。
?- for(1,N,3),write(a),N=3.
aaa
?- for(1,N,3),write(a),fail.
aaa
false
?- for(1,N,3),M is N * 2,write(M),nl,N=3.
2
4
6
?- for(1,N,3),M is N * 2,write(M),nl.
2
N = 1,
M = 2;
4
N = 2,
M = 4;
6
N = 3,
M = 6;
false
% findall/3と併用。組合せや順列の処理の時しばしば使う。
?- findall(N,for(1,N,10),L).
L = [1,2,3,4,5,6,7,8,9,10]
数値を順に生成するもの。
?- for(1,N,3),write(a),N=3.
aaa
?- for(1,N,3),write(a),fail.
aaa
false
?- for(1,N,3),M is N * 2,write(M),nl,N=3.
2
4
6
?- for(1,N,3),M is N * 2,write(M),nl.
2
N = 1,
M = 2;
4
N = 2,
M = 4;
6
N = 3,
M = 6;
false
% findall/3と併用。組合せや順列の処理の時しばしば使う。
?- findall(N,for(1,N,10),L).
L = [1,2,3,4,5,6,7,8,9,10]
297デフォルトの名無しさん
2011/10/23(日) 11:25:08.28 >>296
ふーむ・・・
数列をただ生成してるだけだけど、Prologだといろんな使い方がある訳か・・・
Haskellだと数列リスト作って後から加工する形かな?
for n m _ | m n == False = []
for n m s = n: for (s n) m s
使用例
*Main> mapM (print.(*2)) (for 1 (<=3) (1+))
2
4
6
[(),(),()]
確かに、>>294の言うとおり、リスト内包表記使う方が自然だね
for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
使用例
*Main> for 1 (<=) 3 (1+)
[1,2,3]
prologの方が、手続き型のforに使い方が近くなるのか
ふーむ・・・
数列をただ生成してるだけだけど、Prologだといろんな使い方がある訳か・・・
Haskellだと数列リスト作って後から加工する形かな?
for n m _ | m n == False = []
for n m s = n: for (s n) m s
使用例
*Main> mapM (print.(*2)) (for 1 (<=3) (1+))
2
4
6
[(),(),()]
確かに、>>294の言うとおり、リスト内包表記使う方が自然だね
for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
使用例
*Main> for 1 (<=) 3 (1+)
[1,2,3]
prologの方が、手続き型のforに使い方が近くなるのか
298デフォルトの名無しさん
2011/10/23(日) 11:27:36.00 あう・・・
>for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
の"fn"は無視して・・・
>for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
の"fn"は無視して・・・
299286
2011/10/24(月) 08:20:39.22 >これはC言語等の下劣な仕様に阿っているのが悪いのであって
は適切な書き込みでありませんでした。恐縮ですが、無いことにしてください。
は適切な書き込みでありませんでした。恐縮ですが、無いことにしてください。
300デフォルトの名無しさん
2011/10/24(月) 16:05:09.28 >>293
for/3の典型的な使い方。 findall/3 の中で使う。
ふたつ取り出す(_リスト,_一つ目,_二つ目) :-
length(_リスト,_リストの長さ),
findall(N,for(1,N,_リストの長さ),L),
順列(L,2,[M,N]),
nth1(M,_リスト,_一つ目),
nth1(N,_リスト,_二つ目).
?- ふたつ取り出す([赤,青,緑],_一つ目,_二つ目).
_一つ目 = '赤',
_二つ目 = '青';
_一つ目 = '赤',
_二つ目 = '緑';
_一つ目 = '青',
_二つ目 = '赤';
_一つ目 = '青',
_二つ目 = '緑';
_一つ目 = '緑',
_二つ目 = '赤';
_一つ目 = '緑',
_二つ目 = '青';
false
for/3の典型的な使い方。 findall/3 の中で使う。
ふたつ取り出す(_リスト,_一つ目,_二つ目) :-
length(_リスト,_リストの長さ),
findall(N,for(1,N,_リストの長さ),L),
順列(L,2,[M,N]),
nth1(M,_リスト,_一つ目),
nth1(N,_リスト,_二つ目).
?- ふたつ取り出す([赤,青,緑],_一つ目,_二つ目).
_一つ目 = '赤',
_二つ目 = '青';
_一つ目 = '赤',
_二つ目 = '緑';
_一つ目 = '青',
_二つ目 = '赤';
_一つ目 = '青',
_二つ目 = '緑';
_一つ目 = '緑',
_二つ目 = '赤';
_一つ目 = '緑',
_二つ目 = '青';
false
301デフォルトの名無しさん
2011/10/24(月) 19:07:03.79 >>300
ご存知かもしれませんが、select/3を使うと、もっとシンプルに書けますよ。
choice2(L, E1, E2) :- select(E1, L, L1), select(E2, L1, _).
ご存知かもしれませんが、select/3を使うと、もっとシンプルに書けますよ。
choice2(L, E1, E2) :- select(E1, L, L1), select(E2, L1, _).
302デフォルトの名無しさん
2011/10/24(月) 21:04:25.60303302
2011/10/24(月) 21:07:52.52 ガウス行列の述語群は間違っているところがあって、
正しく実行されません。forの使い方の例として見るためのものとしてください。
正しく実行されません。forの使い方の例として見るためのものとしてください。
304デフォルトの名無しさん
2011/10/26(水) 14:30:19.35305デフォルトの名無しさん
2011/10/26(水) 17:32:24.68306デフォルトの名無しさん
2011/10/27(木) 20:03:54.30 >>302
ページ内索引を設けるなどして、参照しやすく作られていると助かります。
ページ内索引を設けるなどして、参照しやすく作られていると助かります。
307デフォルトの名無しさん
2011/10/27(木) 20:45:58.35 >>306
順不同の2300題のうち約300題を抜き取ったもので、どんな索引を
作るかなど、課題山積ですね。for/3述語から始まるループに名前が
付けられれば、索引は作りやすい。for/3は最も名前を与えにくい述語
ですが、これに限らず部分計算のかけらに適切な名前を与えることが
現在のそしてこれからのテーマです。
順不同の2300題のうち約300題を抜き取ったもので、どんな索引を
作るかなど、課題山積ですね。for/3述語から始まるループに名前が
付けられれば、索引は作りやすい。for/3は最も名前を与えにくい述語
ですが、これに限らず部分計算のかけらに適切な名前を与えることが
現在のそしてこれからのテーマです。
308デフォルトの名無しさん
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
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 今年の漢字 [ぐれ★]
- 今年の漢字は「熊」に決定! 相次ぐクマ被害 去年は「金」 [冬月記者★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ★3 [冬月記者★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★4 [蚤の市★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 ★4 [蚤の市★]
- 【おこめ券】物価高対策の“おこめ券”全米販は1枚477円で販売へ 鈴木農水大臣「国民の皆様に活用いただきやすいよう工夫いただいた」 [ぐれ★]
- 【速報】今年の漢字、「熊」!wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 鈴木農水大臣「今年の漢字は苗。総理のお名前もある」 [256556981]
- 今年の「感じ」を予想するスレ
- 【悲報】お笑い国家ウクライナ、GDPの27%を国防費にぶち込む🥹 [616817505]
- たつき鯨のせいで人生狂ったんだが
- 【速報】今年のゲームオブザイヤー、Clair Obscur: Expedition 33 [779938112]
