Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2010/11/06(土) 13:00:56450デフォルトの名無しさん
2012/03/13(火) 00:04:25.78 >>449
http://hlab.ta.chiba-u.jp/article.php?story=20090206114807903
このコードです。まったくの初心者なので支離滅裂なことを言っているかもしれませんが、
・initCells :- hogehoge.のあとinitCells.と書いているのでgoの中でinitCellsを改めて呼び出す必要はないのでは?
・initCellsは常に否定で終わるのに、goの中の以降の処理が実行されているのはなぜ?
というのが疑問です。
http://hlab.ta.chiba-u.jp/article.php?story=20090206114807903
このコードです。まったくの初心者なので支離滅裂なことを言っているかもしれませんが、
・initCells :- hogehoge.のあとinitCells.と書いているのでgoの中でinitCellsを改めて呼び出す必要はないのでは?
・initCellsは常に否定で終わるのに、goの中の以降の処理が実行されているのはなぜ?
というのが疑問です。
451デフォルトの名無しさん
2012/03/13(火) 00:38:43.29 >>450
まず最初に、コードの解説から
これは>>449で書いた最初のケースの具体例で、手続き的な2重ループ処理だね
述語between/3はバックトラックで再呼び出しされるたびに別の解を返すから、
その between(1, MX, I), between(1, MY, J), ...., fail. という部分は、
以下のCコードの処理と似ている
for (i = 1; i <= mx; i++) {
for (j = 1; j <= my; j++)
....
}
バックトラックは、initCells :- ... の最後のfail呼び出しを契機に発生し、
between x2が返す全ての解を探索し終えると(=二重ループ処理を抜けると)否定を返す
でも、(>>450で書いたように)initCells全体の処理は肯定で終わらせたいから、
最後にbody部が空な(=常に真を返す) initCells. が置かれてる
Prologでしばしば見かける手続き的なコーディング技法だね(自分は好まないけど....)
次に、質問について答えよう
>・initCells :- hogehoge.のあとinitCells.と書いているので
> goの中でinitCellsを改めて呼び出す必要はないのでは?
initCells定義のbody内でinitCellsが(再帰的に)呼ばれているのは、ループ処理を実現するため
だから、そのループを開始するきっかけとしてgoからinitCellsの呼び出しが必要になる
>・initCellsは常に否定で終わるのに、goの中の以降の処理が実行されているのはなぜ?
最後に置かれた(body部が空の)initCells定義が、常に肯定(真)を返すから
まず最初に、コードの解説から
これは>>449で書いた最初のケースの具体例で、手続き的な2重ループ処理だね
述語between/3はバックトラックで再呼び出しされるたびに別の解を返すから、
その between(1, MX, I), between(1, MY, J), ...., fail. という部分は、
以下のCコードの処理と似ている
for (i = 1; i <= mx; i++) {
for (j = 1; j <= my; j++)
....
}
バックトラックは、initCells :- ... の最後のfail呼び出しを契機に発生し、
between x2が返す全ての解を探索し終えると(=二重ループ処理を抜けると)否定を返す
でも、(>>450で書いたように)initCells全体の処理は肯定で終わらせたいから、
最後にbody部が空な(=常に真を返す) initCells. が置かれてる
Prologでしばしば見かける手続き的なコーディング技法だね(自分は好まないけど....)
次に、質問について答えよう
>・initCells :- hogehoge.のあとinitCells.と書いているので
> goの中でinitCellsを改めて呼び出す必要はないのでは?
initCells定義のbody内でinitCellsが(再帰的に)呼ばれているのは、ループ処理を実現するため
だから、そのループを開始するきっかけとしてgoからinitCellsの呼び出しが必要になる
>・initCellsは常に否定で終わるのに、goの中の以降の処理が実行されているのはなぜ?
最後に置かれた(body部が空の)initCells定義が、常に肯定(真)を返すから
452デフォルトの名無しさん
2012/03/13(火) 00:45:08.83 >>450
以下のPrologプログラミング解説ページ内にある、
「繰り返し - 失敗駆動ループ」という節が参考になると思う
・M.Hiroi's Home Page / Prolog Programming
http://www.geocities.jp/m_hiroi/prolog/prolog03.html#chap14
以下のPrologプログラミング解説ページ内にある、
「繰り返し - 失敗駆動ループ」という節が参考になると思う
・M.Hiroi's Home Page / Prolog Programming
http://www.geocities.jp/m_hiroi/prolog/prolog03.html#chap14
453デフォルトの名無しさん
2012/03/13(火) 11:16:10.30454デフォルトの名無しさん
2012/03/17(土) 20:48:38.00455デフォルトの名無しさん
2012/03/18(日) 05:29:34.55 >>454
現在のProlog処理系環境では、
listing と consult が最速。
clause や assert を使って
自前で処理すると遅くなる。
get_heap_vector 的な述語があるなら、
そういう可能性もあるだろうけれど。
現在のProlog処理系環境では、
listing と consult が最速。
clause や assert を使って
自前で処理すると遅くなる。
get_heap_vector 的な述語があるなら、
そういう可能性もあるだろうけれど。
456デフォルトの名無しさん
2012/03/19(月) 02:12:06.59 Prolog で、例えば eq という同値関係を記述するのに
eq(X, X).
eq(X, Y) :-
eq(Y, X).
eq(X, Z) :-
eq(X, Y),
eq(Y, Z).
としたのですが、この関係を満たさない質問を Prolog に与えると無限ループに陥ります。
例えば
?- eq(a,a).
yes
ですが
?- eq(a,b).
(無限ループ)
となってしまいます。
eq(X, X).
eq(X, Y) :-
eq(Y, X).
eq(X, Z) :-
eq(X, Y),
eq(Y, Z).
としたのですが、この関係を満たさない質問を Prolog に与えると無限ループに陥ります。
例えば
?- eq(a,a).
yes
ですが
?- eq(a,b).
(無限ループ)
となってしまいます。
457デフォルトの名無しさん
2012/03/19(月) 07:30:01.96 >>456
これは左再帰と呼ばれる問題です。
Prologが自然言語解析に向いていると期待されて、
集中して研究された始めた時にいきなりこの問題で躓きました。
p :- p, ...
という定義をすると無限ループに陥ります。一番左(実効として) に
pがくる再帰が不可ということになります。
>>456 の例ですと、第二節の本体からの呼び出し :- e(Y,X).
で :- e(b,a). は
第一節 e(X,X). と適合せず、第二節 e(X,Y) :- e(Y,X). が適合して
e(b,a) :- e(a,b). となり、 :- e(a,b). を呼び出すことになり、
最初の質問に戻ってこれを繰り返すことになります。
結論としてPrologで第二節、第三節で意図された定義は不可能です。
これは左再帰と呼ばれる問題です。
Prologが自然言語解析に向いていると期待されて、
集中して研究された始めた時にいきなりこの問題で躓きました。
p :- p, ...
という定義をすると無限ループに陥ります。一番左(実効として) に
pがくる再帰が不可ということになります。
>>456 の例ですと、第二節の本体からの呼び出し :- e(Y,X).
で :- e(b,a). は
第一節 e(X,X). と適合せず、第二節 e(X,Y) :- e(Y,X). が適合して
e(b,a) :- e(a,b). となり、 :- e(a,b). を呼び出すことになり、
最初の質問に戻ってこれを繰り返すことになります。
結論としてPrologで第二節、第三節で意図された定義は不可能です。
458デフォルトの名無しさん
2012/03/19(月) 09:58:06.54 解決方法
1. eqを述語でなく関数とする
2. XSBのような導出節をテーブル化してくれる処理系を使う
3. マジックセット変形する
1. eqを述語でなく関数とする
2. XSBのような導出節をテーブル化してくれる処理系を使う
3. マジックセット変形する
459デフォルトの名無しさん
2012/03/22(木) 07:28:43.08 おはようございます
いま一筆書きゲームがブームですが
Prologで一筆書きを解けますか?
ただし上記ゲームには、一部の経路に
・一方通行
・必ず2回通る経路
があり
・ワープ1つ(一方の点に入ったら他方の点に強制ワープ。何度も使える。)
があります
いま一筆書きゲームがブームですが
Prologで一筆書きを解けますか?
ただし上記ゲームには、一部の経路に
・一方通行
・必ず2回通る経路
があり
・ワープ1つ(一方の点に入ったら他方の点に強制ワープ。何度も使える。)
があります
460デフォルトの名無しさん
2012/03/22(木) 19:24:15.07 要はそういうプログラムを書けってことね
461デフォルトの名無しさん
2012/03/22(木) 19:47:20.63 学校の宿題は自分で考えたほうが本人の為になると思うな
462デフォルトの名無しさん
2012/03/22(木) 21:13:34.63 Prologで表現できるかできないかを聞きたいだけ
できるなら自分で作るし
できないなら他を当たる
できるなら自分で作るし
できないなら他を当たる
463デフォルトの名無しさん
2012/03/22(木) 21:26:11.51 できない場合はできない理由を添えて提出する、までが宿題です
464デフォルトの名無しさん
2012/03/22(木) 21:27:57.77 >>462
>Prologで表現できるかできないかを聞きたいだけ
一言で言えば、「できる」
もし本気で知りたいと願うのなら、"一筆書き Prolog" でグクるくらいのことはやってみろ
その上で、Prologのプログラミング技法に疑問があれば、このスレで問えばいい
もしPrologにおける全解探索の一般的な表現(プログラミング)を知りたければ、
たとえば以下のサイトが参考になる(特に、パズル解きに興味があるヤシには最適)
・お気楽 Prolog プログラミング入門
http://www.geocities.jp/m_hiroi/prolog/
>Prologで表現できるかできないかを聞きたいだけ
一言で言えば、「できる」
もし本気で知りたいと願うのなら、"一筆書き Prolog" でグクるくらいのことはやってみろ
その上で、Prologのプログラミング技法に疑問があれば、このスレで問えばいい
もしPrologにおける全解探索の一般的な表現(プログラミング)を知りたければ、
たとえば以下のサイトが参考になる(特に、パズル解きに興味があるヤシには最適)
・お気楽 Prolog プログラミング入門
http://www.geocities.jp/m_hiroi/prolog/
465デフォルトの名無しさん
2012/03/22(木) 21:30:08.50 計算量はどうでもいいならできるだろ。
AとBがワープ関係のとき、A→B→Aのような無意味なループを発生させる経路を省けば、経路は有限だからな。総当りでいける。
AとBがワープ関係のとき、A→B→Aのような無意味なループを発生させる経路を省けば、経路は有限だからな。総当りでいける。
466デフォルトの名無しさん
2012/03/22(木) 21:31:38.06 チューリング完全
467デフォルトの名無しさん
2012/03/23(金) 06:57:33.70 >>462
私は昨日早速その問題をやってみようと思って始めたのですが、
ワープの意味がよく分からず止めました。多分、検索すれば
わかりやすい説明が見つかるのだろうけれど。
Prologにできるか、できないか、ということになると、できる。
できるどころか、何をやってるいるかを明確に示しているか
という観点で評価するなら、全てのプログラム言語の中で、
最上のコードが書けるだろう。
私は昨日早速その問題をやってみようと思って始めたのですが、
ワープの意味がよく分からず止めました。多分、検索すれば
わかりやすい説明が見つかるのだろうけれど。
Prologにできるか、できないか、ということになると、できる。
できるどころか、何をやってるいるかを明確に示しているか
という観点で評価するなら、全てのプログラム言語の中で、
最上のコードが書けるだろう。
468459
2012/03/23(金) 07:55:58.05469デフォルトの名無しさん
2012/03/24(土) 14:54:58.78 ワープは一方通行を使って表現できる
470デフォルトの名無しさん
2012/03/27(火) 14:45:46.26 >>468
すみません。この問題のこと忘れていました。
もっとも基本形からスタートさせてください。
%
% 一方通行のみ
% ワープなし
%
筆のみち(b,c).
筆のみち(a,b).
筆のみち(d,c).
筆のみち(c,a).
筆のみち(a,d).
一筆書き(_起点,_順路) :-
findall([A,B],(
筆のみち(A,B)),
L),
一筆書き(_起点,L,[],_順路).
一筆書き(_節,[],_,[_節]).
一筆書き(_節,L1,L2,[_節|R3]) :-
append(L0,[[_節,_隣]|R2],L1),
\+(member([_節,_隣],L2)),
append(L0,R2,L3),
一筆書き(_隣,L3,[[_節,_隣]|L2],R3).
すみません。この問題のこと忘れていました。
もっとも基本形からスタートさせてください。
%
% 一方通行のみ
% ワープなし
%
筆のみち(b,c).
筆のみち(a,b).
筆のみち(d,c).
筆のみち(c,a).
筆のみち(a,d).
一筆書き(_起点,_順路) :-
findall([A,B],(
筆のみち(A,B)),
L),
一筆書き(_起点,L,[],_順路).
一筆書き(_節,[],_,[_節]).
一筆書き(_節,L1,L2,[_節|R3]) :-
append(L0,[[_節,_隣]|R2],L1),
\+(member([_節,_隣],L2)),
append(L0,R2,L3),
一筆書き(_隣,L3,[[_節,_隣]|L2],R3).
471470
2012/03/27(火) 14:48:24.49 %
% 一方通行のみ
% 一回通行のみ
% ワープなし
%
でした。
% 一方通行のみ
% 一回通行のみ
% ワープなし
%
でした。
472デフォルトの名無しさん
2012/03/27(火) 14:56:33.93 多分この問題、双方向なのにどちらかの方向一回しか利用できない、
ということの定義の仕方が難しいのでしょうね。
節に入っているみちの中で、一方通行がひとつだけ。このひとつがワープかな。
ワープを宣言して、他の一方通行の定義を排除したいですね。ということは、
筆のみちを定義する部分から、プログラムとした方がよさそうです。
ということの定義の仕方が難しいのでしょうね。
節に入っているみちの中で、一方通行がひとつだけ。このひとつがワープかな。
ワープを宣言して、他の一方通行の定義を排除したいですね。ということは、
筆のみちを定義する部分から、プログラムとした方がよさそうです。
473デフォルトの名無しさん
2012/03/27(火) 15:07:58.93 >>472
節に入っているみちの中で、一方通行がひとつだけ。このひとつがワープかな。
この部分違いました。
ワープはその他に複数回の使用が可能という規則があります。
一回使用のみは[_], 二回使用可は [_,_], で表すとしたら、この無限大に近いワープは
どう表現しましょうか。変数のままにしておきましょうか。
途中既に使用したみちであるかどうか \+(member([_節,_隣],L1)), で検査していますが、
ここで使用可能数を示すリストの要素をひとつ削ることになりそうです。
節に入っているみちの中で、一方通行がひとつだけ。このひとつがワープかな。
この部分違いました。
ワープはその他に複数回の使用が可能という規則があります。
一回使用のみは[_], 二回使用可は [_,_], で表すとしたら、この無限大に近いワープは
どう表現しましょうか。変数のままにしておきましょうか。
途中既に使用したみちであるかどうか \+(member([_節,_隣],L1)), で検査していますが、
ここで使用可能数を示すリストの要素をひとつ削ることになりそうです。
474デフォルトの名無しさん
2012/03/27(火) 15:09:50.17 >>473
また間違えた。 \+(member([_節,_隣],L2)), でしたね。
また間違えた。 \+(member([_節,_隣],L2)), でしたね。
475営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 17:21:48.15 PPAI勉強してます.11.1にあるコード片なんだけど,
s(Stacks,[Stack1,[Top1| Stack2]| OtherStacks]):-
del([Top1|Stack1],Stacks,Stacks1),
del(Stack2,Stacks1,OtherStacks).
del(X,[X|L],L).
del(X,[Y|L],[Y|L1]):-
del(X,L,L1).
これでs([[a,b,c],[],[]],S).って質問しても
S=[[b,c],[a],[]];
S=[[b,c],[a],[]];
false.
ってなる.
本にのってるようなState Spaceにならないのは何故なんでしょうか
s(Stacks,[Stack1,[Top1| Stack2]| OtherStacks]):-
del([Top1|Stack1],Stacks,Stacks1),
del(Stack2,Stacks1,OtherStacks).
del(X,[X|L],L).
del(X,[Y|L],[Y|L1]):-
del(X,L,L1).
これでs([[a,b,c],[],[]],S).って質問しても
S=[[b,c],[a],[]];
S=[[b,c],[a],[]];
false.
ってなる.
本にのってるようなState Spaceにならないのは何故なんでしょうか
476デフォルトの名無しさん
2012/04/12(木) 22:59:37.55 prologで変数名や術語名にL0とかfoo0とか数値を末尾に付けるのはどういう規則でつけてるんでしょう?
477デフォルトの名無しさん
2012/04/13(金) 03:38:45.64 >>476
一般には出現順に1,2,... ,n と振って行きますね。結果として第一引数が1とか。
でもここが大事というところには振らないこともある。
append(L1,L2,L3,L). は append(L1,L2,L3,L4). でも一向に構わないのだけれど、
Lに注目させようと、パターンから外す。
?- append(L0,[A|R1],[1,2,3]). が何故L0かというと、
?- member(A,[1,2,3]). の変形と考えているから。第一引数というより番外(0)だよと。
本当のことを言うと、このインデックス状の名付けはPrologの痛い所。
こんなことをしなくて済んで欲しいのにという意味で。Prologは数字が嫌いですから。
一般には出現順に1,2,... ,n と振って行きますね。結果として第一引数が1とか。
でもここが大事というところには振らないこともある。
append(L1,L2,L3,L). は append(L1,L2,L3,L4). でも一向に構わないのだけれど、
Lに注目させようと、パターンから外す。
?- append(L0,[A|R1],[1,2,3]). が何故L0かというと、
?- member(A,[1,2,3]). の変形と考えているから。第一引数というより番外(0)だよと。
本当のことを言うと、このインデックス状の名付けはPrologの痛い所。
こんなことをしなくて済んで欲しいのにという意味で。Prologは数字が嫌いですから。
478デフォルトの名無しさん
2012/05/01(火) 03:30:41.37 とにかく遅い,原理的に遅くならざるをえない,に限る.ぷろろのけってんは
479デフォルトの名無しさん
2012/05/01(火) 11:41:29.67 >>478
遅いと云っても、たかだか数百倍だよ。
遅いと云っても、たかだか数百倍だよ。
480デフォルトの名無しさん
2012/05/02(水) 22:48:59.62481デフォルトの名無しさん
2012/05/06(日) 13:49:04.02482デフォルトの名無しさん
2012/06/06(水) 16:02:07.01 Prologでは述語の引数に複合項はあまり使われないのでしょうか?
述語の引数の数(アリティ)が多い場合に可読性が劇落ちするので、
display(person(name(NAME), age(AGE))) :-
write(NAME), write('¥t'), write(AGE), nl.
のような述語が有れば、
display(person(name('Taro Yamamoto'), age(100))).
となってとっても読み易いと思うのですが。
述語の引数の数(アリティ)が多い場合に可読性が劇落ちするので、
display(person(name(NAME), age(AGE))) :-
write(NAME), write('¥t'), write(AGE), nl.
のような述語が有れば、
display(person(name('Taro Yamamoto'), age(100))).
となってとっても読み易いと思うのですが。
483デフォルトの名無しさん
2012/06/06(水) 16:44:31.68 >>482
そうですね。私などは徹して、引数はアトム、変数で構造体はリストだけを許しています。
これは私の流儀であり、すべてのプログラマがそうであったり、何か規則でそうなって
いるわけでもありません。わかりやすく、かつ、安全なプログラミングのためには、それが
鉄則と思っているだけです。OSのように、情報源と消費地が離れていて、しかも、停止し
ないプログラミングでは持ち回る引数が多くなりすぎるということは確かにあります。
かってのPrologマシンでオブジェクト指向を採用し、Objectというような名前の変数を
持ち回ったりしたのも、変数の数を減らしたいという理由も少しはあったと思います。
そうですね。私などは徹して、引数はアトム、変数で構造体はリストだけを許しています。
これは私の流儀であり、すべてのプログラマがそうであったり、何か規則でそうなって
いるわけでもありません。わかりやすく、かつ、安全なプログラミングのためには、それが
鉄則と思っているだけです。OSのように、情報源と消費地が離れていて、しかも、停止し
ないプログラミングでは持ち回る引数が多くなりすぎるということは確かにあります。
かってのPrologマシンでオブジェクト指向を採用し、Objectというような名前の変数を
持ち回ったりしたのも、変数の数を減らしたいという理由も少しはあったと思います。
484デフォルトの名無しさん
2012/06/06(水) 16:57:30.24 それで、引数が10個以上にもなってしまう時はどうしているの?という話になるわけですが、
率直にいって、諦めるというのが答えですね。そういうクラスの述語をできるだけ書かなくて
よいように設計する、としかいいようがありません。
率直にいって、諦めるというのが答えですね。そういうクラスの述語をできるだけ書かなくて
よいように設計する、としかいいようがありません。
485デフォルトの名無しさん
2012/06/06(水) 21:22:31.39 > 引数はアトム、変数で構造体はリストだけを許しています。
> (中略)
> わかりやすく、かつ、安全なプログラミングのためには、それが鉄則と思っているだけです。
これはどういう理由なんでしょう?
リスト以外の構造体を使うと「わかりにくい」「危険」なのでしょうか?
> (中略)
> わかりやすく、かつ、安全なプログラミングのためには、それが鉄則と思っているだけです。
これはどういう理由なんでしょう?
リスト以外の構造体を使うと「わかりにくい」「危険」なのでしょうか?
486デフォルトの名無しさん
2012/06/07(木) 05:06:14.38 >>485
この述語が正しく記述できたかは、それを読んでいる副目標の構造と、
述語の頭部を比較するのですが、その時に一瞥で正しさを判断する
ためには、スカラ型データが有利だということが一番大きいと思います。
引数に複合項があり、その中に変数が含まれる場合の判断は遅くなるし
難しくなります。関数名が助けになるのではないかとの質問でしたが、
関数名を適切に与えることは結構難しく、部分構造の後からの変更は
更に難しくなります。Prologが関数型言語と比較して優位なのはこの
ような関数の型評価をほとんど行わなわない、単純なユニフィケーション
に終始できる可能性にあると思っています。
この述語が正しく記述できたかは、それを読んでいる副目標の構造と、
述語の頭部を比較するのですが、その時に一瞥で正しさを判断する
ためには、スカラ型データが有利だということが一番大きいと思います。
引数に複合項があり、その中に変数が含まれる場合の判断は遅くなるし
難しくなります。関数名が助けになるのではないかとの質問でしたが、
関数名を適切に与えることは結構難しく、部分構造の後からの変更は
更に難しくなります。Prologが関数型言語と比較して優位なのはこの
ような関数の型評価をほとんど行わなわない、単純なユニフィケーション
に終始できる可能性にあると思っています。
488デフォルトの名無しさん
2012/06/08(金) 08:58:20.35489デフォルトの名無しさん
2012/06/08(金) 13:01:09.50 単にパターンパッチングとの相性が悪いからだとも思える。
490デフォルトの名無しさん
2012/06/08(金) 15:05:47.88491デフォルトの名無しさん
2012/06/08(金) 22:00:24.54 しかし木構造をフラットに述語表現すると
親子のリンク関係を表すために人工的な識別子を導入する必要がある。
このように表現されたデータ構造は、もはや木構造であることが構文的に
保証されない。Cでポインタを用いる場合と同じような危険性が伴う。
複数の木を扱う場合には識別子の管理も面倒である。
親子のリンク関係を表すために人工的な識別子を導入する必要がある。
このように表現されたデータ構造は、もはや木構造であることが構文的に
保証されない。Cでポインタを用いる場合と同じような危険性が伴う。
複数の木を扱う場合には識別子の管理も面倒である。
492デフォルトの名無しさん
2012/06/08(金) 22:49:48.34 >>488
WANの都合ではなかろうか
WANの都合ではなかろうか
493デフォルトの名無しさん
2012/06/08(金) 22:51:23.00 WAM
494デフォルトの名無しさん
2012/06/08(金) 23:20:51.21 つうか複合節はホーン節でないし。
495デフォルトの名無しさん
2012/06/11(月) 12:14:05.74 SWI-Prolog Editer を使うために32bit版のSWI-Prologをインストールしたんですが、
拡張子の関連づけをEditerのほうに変更するべきなようです。
アイコンが無関連の表示になっていたんですが、変更用のソフトを使ってみると、関連付けが食い違っていました。
拡張子の関連づけをEditerのほうに変更するべきなようです。
アイコンが無関連の表示になっていたんですが、変更用のソフトを使ってみると、関連付けが食い違っていました。
496デフォルトの名無しさん
2012/06/11(月) 13:06:52.54 ___ ━┓ ___ ━┓
/ ― \ ┏┛/ ―\ ┏┛
/ (●) \ヽ ・. /ノ (●)\ ・
/ (⌒ (●) /. | (●) ⌒)\ ____
/  ̄ヽ__) / | (__ノ ̄ | . / -- 丶、
/´ ___/ \ / . / ノ ●) ヽ┏┓
| \ \ _ノ .| (●, ,⊃ ノ ┏┛
| | /´ `\ .ゝ、 `´ .へ ・
/ ― \ ┏┛/ ―\ ┏┛
/ (●) \ヽ ・. /ノ (●)\ ・
/ (⌒ (●) /. | (●) ⌒)\ ____
/  ̄ヽ__) / | (__ノ ̄ | . / -- 丶、
/´ ___/ \ / . / ノ ●) ヽ┏┓
| \ \ _ノ .| (●, ,⊃ ノ ┏┛
| | /´ `\ .ゝ、 `´ .へ ・
497デフォルトの名無しさん
2012/06/11(月) 14:19:53.34 >>482
リスト以外の複合項で引数の受け手側が待ち受けるということはしませんね。一般的には
そちらの方が可読性が極端に悪くなります。
再帰の場合は、受取側の引数の並びと引き渡し側の引数の並びを一瞥して比較するという
ことがPrologプログラミングの仕事ですから、構造体があったのでは堪りません。
できれば、リストも避けたい。再帰さへできることなら回避したい。不要な繰り返しを
排除し、平坦に、平明さを追求するのがPrologではないでしょうか。
リスト以外の複合項で引数の受け手側が待ち受けるということはしませんね。一般的には
そちらの方が可読性が極端に悪くなります。
再帰の場合は、受取側の引数の並びと引き渡し側の引数の並びを一瞥して比較するという
ことがPrologプログラミングの仕事ですから、構造体があったのでは堪りません。
できれば、リストも避けたい。再帰さへできることなら回避したい。不要な繰り返しを
排除し、平坦に、平明さを追求するのがPrologではないでしょうか。
498デフォルトの名無しさん
2012/06/11(月) 22:50:04.95 可読性というのは読み手に依存する性質であるから、
特別な事情がなければ一般的な読み手が慣れ親しんでいる
書き方をした方が読みやすくなるといえる。
そして読み手の多くは、構造化データのようにものごとを階層化して
整理するやり方に慣れているということを考えると、複合項を適切に
用いることで可読性が向上すると考えるのが自然である。
余談だが、これは仮名遣いにしても同様である。
特別な事情がなければ一般的な読み手が慣れ親しんでいる
書き方をした方が読みやすくなるといえる。
そして読み手の多くは、構造化データのようにものごとを階層化して
整理するやり方に慣れているということを考えると、複合項を適切に
用いることで可読性が向上すると考えるのが自然である。
余談だが、これは仮名遣いにしても同様である。
499デフォルトの名無しさん
2012/06/20(水) 13:04:54.67 http://www.swi-prolog.org/pldoc/doc_for?object=exists_file/1
exists_file/1ってなんか英文法的におかしく無いですか?
file_exists/1ですよね?
exists_file/1ってなんか英文法的におかしく無いですか?
file_exists/1ですよね?
500デフォルトの名無しさん
2012/06/23(土) 07:05:41.56 >>499
私は知りませんが、述語+対象を原則としたところから始まったのでしょうか。
最初に concat_atom があり、後に atom_concat が生まれ、atom_concat に倣うように
atomic_list_concat が生まれる。こうなると訳がわからない。
私は知りませんが、述語+対象を原則としたところから始まったのでしょうか。
最初に concat_atom があり、後に atom_concat が生まれ、atom_concat に倣うように
atomic_list_concat が生まれる。こうなると訳がわからない。
501デフォルトの名無しさん
2012/06/23(土) 07:17:40.99 concat_atomは第一引数のリストの中のアトムか整数を結合した長いアトムを第二引数にunifyする。
atom_concatは第一引数、第二引数のアトムを結合したアトムを第三引数にunifyする。
atomic_list_concatはconcat_atomと同じだが、アトムと、整数だけでなく浮動小数点を含んだ
数を公式に許した。歴史的事情によってこう命名されたのだと理解している。
atom_concatは第一引数、第二引数のアトムを結合したアトムを第三引数にunifyする。
atomic_list_concatはconcat_atomと同じだが、アトムと、整数だけでなく浮動小数点を含んだ
数を公式に許した。歴史的事情によってこう命名されたのだと理解している。
502デフォルトの名無しさん
2012/06/24(日) 16:46:20.77503デフォルトの名無しさん
2012/06/24(日) 17:51:51.91504デフォルトの名無しさん
2012/06/24(日) 17:59:57.52505デフォルトの名無しさん
2012/06/24(日) 22:50:43.44506デフォルトの名無しさん
2012/06/25(月) 12:31:32.85 ノイマン型を意識ぜずにプログラム書く奴いるのか?
トイプログラムならどうでもいいだろうけど。
トイプログラムならどうでもいいだろうけど。
507デフォルトの名無しさん
2012/06/25(月) 12:53:57.00508デフォルトの名無しさん
2012/06/25(月) 12:59:45.16509デフォルトの名無しさん
2012/06/25(月) 13:40:09.16510デフォルトの名無しさん
2012/06/25(月) 16:18:25.34 あらゆるジャンプ先のアドレスを意識してプログラミングする奴がいるか?
511デフォルトの名無しさん
2012/06/25(月) 17:32:32.37 配列かリストか考えるだけでもランダムアクセスメモリのこと意識するんじゃね?
512デフォルトの名無しさん
2012/06/25(月) 18:55:26.23513デフォルトの名無しさん
2012/06/25(月) 21:33:57.47 >>506
Prologの計算モデルを実装するマシンはノイマン型に限定されないと思う
Prologの計算モデルを実装するマシンはノイマン型に限定されないと思う
514デフォルトの名無しさん
2012/06/25(月) 22:55:57.03 データフローw
515デフォルトの名無しさん
2012/06/26(火) 09:24:55.29 ノイマン型を意識する人は死ぬまで1コアマシンを使ってろw
516デフォルトの名無しさん
2012/06/26(火) 10:49:32.92 マルチコアで内部的にシーケンサが複数になってもノイマン型の範疇での話。
517デフォルトの名無しさん
2012/06/26(火) 14:00:36.35 VLIWでインターロックがなくっても(略
ベクトルプロセッサで(略
何を指摘されても、どうとでも言い逃れが可能な論理ですねw
ベクトルプロセッサで(略
何を指摘されても、どうとでも言い逃れが可能な論理ですねw
518デフォルトの名無しさん
2012/06/27(水) 05:55:26.77 http://ja.wikipedia.org/wiki/ハーバード・アーキテクチャ
519デフォルトの名無しさん
2012/07/20(金) 05:35:19.90 >>20を見て気になったのですが、Prologは以下の内容のデータベース構築に向いているのでしょうか?
http://toro.2ch.net/test/read.cgi/tech/1341099441/265
http://toro.2ch.net/test/read.cgi/tech/1341099441/265
520デフォルトの名無しさん
2012/07/20(金) 08:04:16.93521デフォルトの名無しさん
2012/07/20(金) 11:09:59.54 >>520
1GBのテキストとなると、検索で大量の「ユニフィケーションの繰り返し」が
起こるからちょっと疑問。
Prologの向き不向きの話は、ソースプログラムのドキュメントとしての表現力では
確実に他のプログラミング言語の上を行くので、少々遅かったり、書き難い点が
あっても、向かないとは考えない方がよい。
1GBのテキストとなると、検索で大量の「ユニフィケーションの繰り返し」が
起こるからちょっと疑問。
Prologの向き不向きの話は、ソースプログラムのドキュメントとしての表現力では
確実に他のプログラミング言語の上を行くので、少々遅かったり、書き難い点が
あっても、向かないとは考えない方がよい。
522デフォルトの名無しさん
2012/07/20(金) 14:44:53.02 >>519の内容は、単なるインデックス化テキストなんで、
(その上フレーズ検索が含まれてないという簡単仕様)
こういうのが向いてない汎用言語なんて基本的にないのではないか?
awkとかshだと面倒くさそうだけど。
(その上フレーズ検索が含まれてないという簡単仕様)
こういうのが向いてない汎用言語なんて基本的にないのではないか?
awkとかshだと面倒くさそうだけど。
523デフォルトの名無しさん
2012/07/20(金) 15:04:23.23 >>522
Prologの場合は、http://toro.2ch.net/test/read.cgi/tech/1341099441/265 で書かれている
タグが述語ですから、タグの読み方、意味指定等、ルール付けに何の拘束もありません。プログラマの
自由であり、記述力も概ね無限です。
注釈、コメントを含めてのルール付けになりますから、単なる構造体による定義ではありません。
Prologの場合は、http://toro.2ch.net/test/read.cgi/tech/1341099441/265 で書かれている
タグが述語ですから、タグの読み方、意味指定等、ルール付けに何の拘束もありません。プログラマの
自由であり、記述力も概ね無限です。
注釈、コメントを含めてのルール付けになりますから、単なる構造体による定義ではありません。
524デフォルトの名無しさん
2012/07/20(金) 15:16:37.29525デフォルトの名無しさん
2012/07/22(日) 00:12:08.00 タグが述語は余りよろしくないな。
複数タグを付けたり部分一致検索とかしずらい。
複数タグを付けたり部分一致検索とかしずらい。
526デフォルトの名無しさん
2012/07/22(日) 01:29:55.61527デフォルトの名無しさん
2012/07/28(土) 06:53:10.65528デフォルトの名無しさん
2012/07/28(土) 12:32:28.01 Prologで関係データベースのテーブルを節として定義するにはどうしたらいいのでしょうか?
例えば↓みたいな表です。
personテーブル
+--------------------
| id | name | address |
+--------------------
| 1 | yamada | tokyo |
| 2 | yamada | osaka | ←1とは同姓同名で別人
+--------------------
companyテーブル
+--------------------
| id | name | address |
+--------------------
| 1 | yamada | tokyo | ←紛らわしいがyamadaという会社名の会社
| 2 | yamada | osaka |←同名だが1とは別会社
+--------------------
person_companyテーブル
+--------------------
| person_id | company_id |
+--------------------
| 1 | 1 |
| 2 | 2 |
+--------------------
(続きあり)
例えば↓みたいな表です。
personテーブル
+--------------------
| id | name | address |
+--------------------
| 1 | yamada | tokyo |
| 2 | yamada | osaka | ←1とは同姓同名で別人
+--------------------
companyテーブル
+--------------------
| id | name | address |
+--------------------
| 1 | yamada | tokyo | ←紛らわしいがyamadaという会社名の会社
| 2 | yamada | osaka |←同名だが1とは別会社
+--------------------
person_companyテーブル
+--------------------
| person_id | company_id |
+--------------------
| 1 | 1 |
| 2 | 2 |
+--------------------
(続きあり)
529デフォルトの名無しさん
2012/07/28(土) 12:33:22.07 >>528
ただし、person(1, yamada, tokyo).といった定義は不可とします。
なぜなら、この節定義では、1とyamadaとtokyoの「意味」がプログラムとして定義されていないからです。
1がpersonテーブルのidだと解釈できるのはプログラム外のコメント文やドキュメントを読んだプログラマだけです。
(C言語の構造体やJavaのクラスでは変数名として意味を定義できています。)
(おわり)
ただし、person(1, yamada, tokyo).といった定義は不可とします。
なぜなら、この節定義では、1とyamadaとtokyoの「意味」がプログラムとして定義されていないからです。
1がpersonテーブルのidだと解釈できるのはプログラム外のコメント文やドキュメントを読んだプログラマだけです。
(C言語の構造体やJavaのクラスでは変数名として意味を定義できています。)
(おわり)
530デフォルトの名無しさん
2012/07/28(土) 13:59:37.01 person(id(1), name(yamada), address(tokyo)).
531デフォルトの名無しさん
2012/07/28(土) 14:56:59.84532デフォルトの名無しさん
2012/07/28(土) 21:24:10.18 >>531
その議論に参加していたが、つまり何が言いたい?
その議論に参加していたが、つまり何が言いたい?
533デフォルトの名無しさん
2012/07/29(日) 05:12:05.59 >>530
本当に必要な情報は第何引数にnameがあるかというようなもの。
テーブル情報(person,1,id,integer).
テーブル情報(person,2,namae,atom).
テーブル情報(person,3,address,atom).
のような述語定義をする他ない。
本当に必要な情報は第何引数にnameがあるかというようなもの。
テーブル情報(person,1,id,integer).
テーブル情報(person,2,namae,atom).
テーブル情報(person,3,address,atom).
のような述語定義をする他ない。
535デフォルトの名無しさん
2012/07/29(日) 12:37:48.14 >>533
>本当に必要な情報は第何引数にnameがあるかというようなもの。
そのとおりだと思うし、これがすべてだね
>>529の発想を裏返せば、
「C言語の関数やJavaのメソッドは引数と関数名(メソッド名)の意味が定義されていない」
から大問題だという話になる
あるいはSmalltalk/Objective-Cのメッセージ定義やRubyのハッシュ引数などのように、
名前で引数に意味を与えることのできる言語以外は一切認めない....ように見える
自分なら>>528は単純に書く
person(1, yamada, tokyo).
person(2, yamada, osaka).
company(1, yamada, tokyo).
company(2, yamada, osaka).
person_company(1, 1).
person_company(2, 2).
Prologにおける>>529の制約はナンセンスだと思う
>本当に必要な情報は第何引数にnameがあるかというようなもの。
そのとおりだと思うし、これがすべてだね
>>529の発想を裏返せば、
「C言語の関数やJavaのメソッドは引数と関数名(メソッド名)の意味が定義されていない」
から大問題だという話になる
あるいはSmalltalk/Objective-Cのメッセージ定義やRubyのハッシュ引数などのように、
名前で引数に意味を与えることのできる言語以外は一切認めない....ように見える
自分なら>>528は単純に書く
person(1, yamada, tokyo).
person(2, yamada, osaka).
company(1, yamada, tokyo).
company(2, yamada, osaka).
person_company(1, 1).
person_company(2, 2).
Prologにおける>>529の制約はナンセンスだと思う
536デフォルトの名無しさん
2012/07/29(日) 15:09:27.74 C とか Java だったらデータは構造体やクラスとして定義するわけで、関数やメソッドとしてなんか定義しない。
データと処理を明確に区別するパラダイムなの。
一方 Prolog は全部節定義でやるから、そこにぶつけた話なんでしょ。
>>533 の方式は、プログラマが読めば理解できる定義だけど、実行時にプログラムから使うのは面倒そうかな。
何番目が address なのかは取得できても、そこから簡単にクエリー組み立てられないよね。
person(name, 1, yamada).
person(address, 1, tokyo).
みたいな定義はどうかな。
これだとテーブル上での順番とかを考える必要はなくて、例えば address が tokyo の人を取得するのを
person(address, Id, tokyo)
みたいに書ける。
データと処理を明確に区別するパラダイムなの。
一方 Prolog は全部節定義でやるから、そこにぶつけた話なんでしょ。
>>533 の方式は、プログラマが読めば理解できる定義だけど、実行時にプログラムから使うのは面倒そうかな。
何番目が address なのかは取得できても、そこから簡単にクエリー組み立てられないよね。
person(name, 1, yamada).
person(address, 1, tokyo).
みたいな定義はどうかな。
これだとテーブル上での順番とかを考える必要はなくて、例えば address が tokyo の人を取得するのを
person(address, Id, tokyo)
みたいに書ける。
537535
2012/07/29(日) 15:56:55.27538デフォルトの名無しさん
2012/07/29(日) 16:30:28.00 >>536
クエリー生成(_テーブル名,_引数リスト,_クエリー) :- findall(_,テーブル情報(_テーブル名,_,_,_),_引数リスト),_クエリー =.. [_テーブル名|_引数リスト].
あとはnth1/3かnth0/3を使って自分の検索したいフィールドと変数を結びつける。
クエリー生成(_テーブル名,_引数リスト,_クエリー) :- findall(_,テーブル情報(_テーブル名,_,_,_),_引数リスト),_クエリー =.. [_テーブル名|_引数リスト].
あとはnth1/3かnth0/3を使って自分の検索したいフィールドと変数を結びつける。
539デフォルトの名無しさん
2012/07/29(日) 16:50:29.26 >>536
> person(name, 1, yamada).
> person(address, 1, tokyo).
は確かに魅力的なモデルだが(Binary Data Model? 連想三つ組?)、
残念ながら、IDの管理が難しい。ここではユーザ設定のidを使うことに
なりそうだが、一般的にはシステムが一意のIDを用意しなくては
ならない。そういう機構をうまく組み込まないと実用にならない。
> person(name, 1, yamada).
> person(address, 1, tokyo).
は確かに魅力的なモデルだが(Binary Data Model? 連想三つ組?)、
残念ながら、IDの管理が難しい。ここではユーザ設定のidを使うことに
なりそうだが、一般的にはシステムが一意のIDを用意しなくては
ならない。そういう機構をうまく組み込まないと実用にならない。
540デフォルトの名無しさん
2012/08/17(金) 07:15:23.82 2つ質問です。
taroはコーヒーのどの種類が好きですか?
という質問が作りたいのですが、どのように記述すればいいでしょうか
test.pl
syurui(coffee,cocoa).
like(taro, cocoa).
こんな感じでいけるかと思いましたが、falseでした。
?- like(taro,syurui(coffee,X)).
あと、ファイル再読み込み(Reload modified files)を頻繁に行うのですが、
ショートカットキーなどはありますか?
taroはコーヒーのどの種類が好きですか?
という質問が作りたいのですが、どのように記述すればいいでしょうか
test.pl
syurui(coffee,cocoa).
like(taro, cocoa).
こんな感じでいけるかと思いましたが、falseでした。
?- like(taro,syurui(coffee,X)).
あと、ファイル再読み込み(Reload modified files)を頻繁に行うのですが、
ショートカットキーなどはありますか?
541デフォルトの名無しさん
2012/08/17(金) 07:19:49.51 一番高速にprolog動かせるのって
どの処理系なの?
どの処理系なの?
542540
2012/08/17(金) 07:20:19.68 すいません、他の言語とごっちゃになってました。
質問を取り下げます。
質問を取り下げます。
543デフォルトの名無しさん
2012/08/17(金) 08:08:50.83 >>540
% 模範解答ではありません。私好みの定義。Prologの自由さを感じてください。
好きなコーヒー(taro,コロンビアスプレモ).
好きなコーヒー(hanako,グァテマラマラゴギーベ).
好きなコーヒー(taro,コスタリカ).
'taroはコーヒーのどの種類が好きですか?'(_コーヒーの種類のリスト,_taroの好きなコーヒーの種類) :-
\+(var(_コーヒーの種類のリスト)),
member(_taroの好きなコーヒーの種類,_コーヒーの種類のリスト),
好きなコーヒー(taro,_taroの好きなコーヒーの種類).
'taroはコーヒーのどの種類が好きですか?'(_コーヒーの種類のリスト,_taroの好きなコーヒーの種類) :-
var(_コーヒーの種類のリスト),
コーヒーの種類のリストを得る(_コーヒーの種類のリスト),
好きなコーヒー(taro,_taroの好きなコーヒーの種類).
コーヒーの種類のリストを得る(_コーヒーの種類のリスト) :-
findall(_コーヒーの種類,(
好きなコーヒー(_,_コーヒーの種類)),
_重複を許すコーヒーの種類のリスト),
sort(_重複を許すコーヒーの種類のリスト,_コーヒーの種類のリスト).
% 模範解答ではありません。私好みの定義。Prologの自由さを感じてください。
好きなコーヒー(taro,コロンビアスプレモ).
好きなコーヒー(hanako,グァテマラマラゴギーベ).
好きなコーヒー(taro,コスタリカ).
'taroはコーヒーのどの種類が好きですか?'(_コーヒーの種類のリスト,_taroの好きなコーヒーの種類) :-
\+(var(_コーヒーの種類のリスト)),
member(_taroの好きなコーヒーの種類,_コーヒーの種類のリスト),
好きなコーヒー(taro,_taroの好きなコーヒーの種類).
'taroはコーヒーのどの種類が好きですか?'(_コーヒーの種類のリスト,_taroの好きなコーヒーの種類) :-
var(_コーヒーの種類のリスト),
コーヒーの種類のリストを得る(_コーヒーの種類のリスト),
好きなコーヒー(taro,_taroの好きなコーヒーの種類).
コーヒーの種類のリストを得る(_コーヒーの種類のリスト) :-
findall(_コーヒーの種類,(
好きなコーヒー(_,_コーヒーの種類)),
_重複を許すコーヒーの種類のリスト),
sort(_重複を許すコーヒーの種類のリスト,_コーヒーの種類のリスト).
544デフォルトの名無しさん
2012/08/18(土) 07:42:46.14 >>543
ありがとうございます!
ありがとうございます!
545543
2012/08/18(土) 08:07:26.97546デフォルトの名無しさん
2012/08/18(土) 11:42:04.21 >>541
速度を追及するなら、自分でWAM実装するのが近道かと
速度を追及するなら、自分でWAM実装するのが近道かと
547uY
2012/08/24(金) 08:23:55.57 Prologを直で触る気はありません
>>>Rubyから<<< Prolog操作したいな〜と思い
https://github.com/preston/ruby-prolog
こんなgem見つけたんですけど使い方が不明です教えてくれませんか
>>>Rubyから<<< Prolog操作したいな〜と思い
https://github.com/preston/ruby-prolog
こんなgem見つけたんですけど使い方が不明です教えてくれませんか
548デフォルトの名無しさん
2012/08/24(金) 11:06:40.75 examplesがあるじゃない。
549デフォルトの名無しさん
2012/08/27(月) 10:44:20.21 >>547
多分、SWI-PrologのsyntaxからRubyのそれへの変換プログラムを
書かないと使い物にならないと思う。Prologを使いたいと思う課題の
述語はそんなに簡単には書けない。Prologの専門家に書いてもらって
それを使うか、専門の処理系で確かめてそれをRubyに移す方が確実。
多分、SWI-PrologのsyntaxからRubyのそれへの変換プログラムを
書かないと使い物にならないと思う。Prologを使いたいと思う課題の
述語はそんなに簡単には書けない。Prologの専門家に書いてもらって
それを使うか、専門の処理系で確かめてそれをRubyに移す方が確実。
550デフォルトの名無しさん
2012/08/27(月) 10:55:31.37 そうかもしれない。Prologの専門家だってこれって問題では、
http://www.amazon.co.jp/dp/0201403757 なんかのお世話になって、
書き写し、書き写し、説明を解読しながら書くものだよ。
http://www.amazon.co.jp/dp/0201403757 なんかのお世話になって、
書き写し、書き写し、説明を解読しながら書くものだよ。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★3 [蚤の市★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ★2 [冬月記者★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 ★2 [蚤の市★]
- 東京都「都民の税金1.5兆円が国に奪われている」「全国に分配されている」に地方民ブチギレ ★2 [Hitzeschleier★]
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★5 [Hitzeschleier★]
- 【ド軍】山本由伸、WBC出場を決断!ドジャースが本人の意向を尊重、佐々木朗希はチームが故障歴を懸念で不参加 [鉄チーズ烏★]
- 「ハイブリッド教科書」でこの国の子どもたちの視力悪化へ… アクセスしてみると映るコンピュータースクリーンの中、チカチカしてる文字 [452836546]
- 竹中平蔵「日米が長年守り続けてき台湾有事に関する曖昧戦略の知恵を一瞬にして無にさせた岡田の責任は非常に重い」 [271912485]
- 肌黒グロマグロ
- お前ら無職にはわからんだろうけど国保高すぎだろ
- 嘘喰い作者「高市総理の自分の命自分で守れ発言を叩いてる左翼、しょーもな!!!」 [935793931]
- 中国人、超ド正論。「チベットやウイグルに住んでるのはチベット族やウイグル族だが、アイヌから奪った土地に住んでる日本人こそ侵略者」 [314039747]
