Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2010/11/06(土) 13:00:56272264=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
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.59■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 ★2 [蚤の市★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★7 [蚤の市★]
- 最新版Z級クソ映画ランキングが決定! [牛丼★]
- 【STARTO ENTERTAINMENT】SUPER EIGHTの横山裕、フジ『ドッキリGP』ロケで全治2ヶ月の重傷 [Ailuropoda melanoleuca★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★2 [蚤の市★]
- 公用車カーナビのNHK受信料「全額免除を」 千葉市議会、国に制度創設求める意見書可決 [少考さん★]
- 【朗報】愛国保守党の公約、ガチでアリだと話題にwwwwwwwwww
- 【朗報】南鳥島のレアアース、中国産の「20倍の純度」青山繁晴氏「日本は資源大国」日本復活のファンファーレが鳴り響く! [673057929]
- 愛国者「釘を使わない日本独自の伝統工法スゴイ!」X民「それ中国起源ですよ」→批判殺到 [834922174]
- ハイドロポンプ←これなんて略してる?
- 👊😅👊三☁😶‍🌫三⛅🏡
- コーヒー、来年3月から30パーセント値上げへ [709039863]
