Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2010/11/06(土) 13:00:56750デフォルトの名無しさん
2014/08/21(木) 15:21:18.64ID:SiLTEdjO >>749
全解をプリントするの意味にもよるが、ビジネスで一覧表を出すような場合は、
これはまた違うと思う。このような表には、集約情報を要求される場合が多く、
失敗駆動は集約には無力なので、一旦findall/3でリストに取る場合が多い。
全解をプリントするの意味にもよるが、ビジネスで一覧表を出すような場合は、
これはまた違うと思う。このような表には、集約情報を要求される場合が多く、
失敗駆動は集約には無力なので、一旦findall/3でリストに取る場合が多い。
751デフォルトの名無しさん
2014/09/16(火) 19:57:50.16ID:PVbEy2qP すみません
カットを使わずにカットと同様のモノは表現できるでしょうか
カットを使わずにカットと同様のモノは表現できるでしょうか
752デフォルトの名無しさん
2014/09/16(火) 22:10:27.01ID:+Ut5bl5+ >>751
前提条件によりけりだよ
ここで前提条件とは:
・カットの種類(グリーンなのかレッドなのか?)
・「同様」という言葉の定義(結果さえ一致すればいいのか効率も考慮するのか)
になる
一般論ではなく、具体的なコードで再質問したほうがいいと思われる
前提条件によりけりだよ
ここで前提条件とは:
・カットの種類(グリーンなのかレッドなのか?)
・「同様」という言葉の定義(結果さえ一致すればいいのか効率も考慮するのか)
になる
一般論ではなく、具体的なコードで再質問したほうがいいと思われる
753デフォルトの名無しさん
2014/09/17(水) 07:53:36.70ID:JrDwRrBo >>751
p :- q1,!.
p :- q2.
のカットはq1に副作用がなければ、
p :- q1.
p :- \+(q1),q2.
と書くことができる。
p(s(1,t(2)) :- !,q1.
p(s(X,t(Y)) :- q2.
は
p(s(1,t(2)) :- q1.
p(s(X,t(Y)) :- \+(X=1),\+(Y=2),q2.
としなくてはならない。
カットがPrologから切り捨てられない話として、否定の定義、
\+(P) :- call(P),!,fail.
\+(P).
がよくあげられる。このカットは代用が効かない。
それから組込述語findall/3の設計からくる問題なのだが、repeatを持つ
標準入力からの入力。(ここでは整数に限定しているが)
?- findall(X,(repeat,read(X),(X=end_of_file,!,fail;integer(X))),L).
この制御のためのカットも他に手がない。
p :- q1,!.
p :- q2.
のカットはq1に副作用がなければ、
p :- q1.
p :- \+(q1),q2.
と書くことができる。
p(s(1,t(2)) :- !,q1.
p(s(X,t(Y)) :- q2.
は
p(s(1,t(2)) :- q1.
p(s(X,t(Y)) :- \+(X=1),\+(Y=2),q2.
としなくてはならない。
カットがPrologから切り捨てられない話として、否定の定義、
\+(P) :- call(P),!,fail.
\+(P).
がよくあげられる。このカットは代用が効かない。
それから組込述語findall/3の設計からくる問題なのだが、repeatを持つ
標準入力からの入力。(ここでは整数に限定しているが)
?- findall(X,(repeat,read(X),(X=end_of_file,!,fail;integer(X))),L).
この制御のためのカットも他に手がない。
754753
2014/09/17(水) 07:59:41.82ID:JrDwRrBo 右括弧が一つ足らなかった。
p(s(1,t(2))) :- !,q1.
p(s(X,t(Y))) :- q2.
と
p(s(1,t(2))) :- q1.
p(s(X,t(Y))) :- \+(X=1),\+(Y=2),q2.
でした。
p(s(1,t(2))) :- !,q1.
p(s(X,t(Y))) :- q2.
と
p(s(1,t(2))) :- q1.
p(s(X,t(Y))) :- \+(X=1),\+(Y=2),q2.
でした。
755753 754
2014/09/17(水) 11:14:56.78ID:vF3wK/oS756デフォルトの名無しさん
2014/09/17(水) 21:30:48.29ID:2WfHlgOC757デフォルトの名無しさん
2014/09/17(水) 23:34:03.64ID:xNQ0rvrC 皆さん、この言語ってどういう動機で覚えたんでしょうか?
なんとなく名前がかっこいいから覚えようと思いましたが、レベル硬くて驚きました。
なんとなく名前がかっこいいから覚えようと思いましたが、レベル硬くて驚きました。
758デフォルトの名無しさん
2014/09/17(水) 23:35:01.45ID:xNQ0rvrC すいません。
硬くて→高くて。
少し触ってみましたがまだポエムすら書けない感じです。
硬くて→高くて。
少し触ってみましたがまだポエムすら書けない感じです。
759デフォルトの名無しさん
2014/09/18(木) 03:49:46.40ID:f3YnogPC sicpでprologを作る章を読んだから
760デフォルトの名無しさん
2014/09/18(木) 13:28:49.42ID:2XScWOD5 学校の授業。
761デフォルトの名無しさん
2014/09/18(木) 18:39:14.23ID:pPyVXEwN 文系の学部だと英語の構文解析の授業でprologを使うと聞いた
762デフォルトの名無しさん
2014/09/18(木) 20:52:07.83ID:fQdBdw40 >>753
>それから組込述語findall/3の設計からくる問題なのだが、repeatを持つ
>標準入力からの入力。(ここでは整数に限定しているが)
>
>?- findall(X,(repeat,read(X),(X=end_of_file,!,fail;integer(X))),L).
>
>この制御のためのカットも他に手がない。
この単純な入力処理であれば、同じ振る舞いをするコードをカット無しで書ける
http://ideone.com/vBLt2R
失敗駆動ループや findall を使わず素直に再帰で表現した初歩的なコードだ
すでに >>744,747 で書いたように、失敗駆動ループはバッド・ノウハウの類いである
また組込み述語 findall/3 の探索するゴールは、 >>748 で例を示したように
副作用を含むべきではない
(組込み述語 read/1 には、入力ストリームを「読み進める」という副作用がある)
率直に言って、この程度の単純な入力処理に対して
「この制御のためのカットも他に手がない」などと安易に判断してしまう >>756 は、
失敗駆動ループや findall といった手続き型による「小手先のテクニック」にこだわるあまり、
論理プログラミングの持つ本質的な単純明快さを見失っているように見える
>それから組込述語findall/3の設計からくる問題なのだが、repeatを持つ
>標準入力からの入力。(ここでは整数に限定しているが)
>
>?- findall(X,(repeat,read(X),(X=end_of_file,!,fail;integer(X))),L).
>
>この制御のためのカットも他に手がない。
この単純な入力処理であれば、同じ振る舞いをするコードをカット無しで書ける
http://ideone.com/vBLt2R
失敗駆動ループや findall を使わず素直に再帰で表現した初歩的なコードだ
すでに >>744,747 で書いたように、失敗駆動ループはバッド・ノウハウの類いである
また組込み述語 findall/3 の探索するゴールは、 >>748 で例を示したように
副作用を含むべきではない
(組込み述語 read/1 には、入力ストリームを「読み進める」という副作用がある)
率直に言って、この程度の単純な入力処理に対して
「この制御のためのカットも他に手がない」などと安易に判断してしまう >>756 は、
失敗駆動ループや findall といった手続き型による「小手先のテクニック」にこだわるあまり、
論理プログラミングの持つ本質的な単純明快さを見失っているように見える
763デフォルトの名無しさん
2014/09/18(木) 21:10:59.37ID:pPyVXEwN filter をカットなしで書く方法を知りたいです
カットなしだと部分リストも答えで出てくる
filter(Pred, [], []).
filter(Pred, [X|Xs], [X|Ys]) :- prove(Pred, [X]), filter(Pred, Xs, Ys).
filter(Pred, [X|Xs], Ys) :- filter(Pred, Xs, Ys).
カットなしだと部分リストも答えで出てくる
filter(Pred, [], []).
filter(Pred, [X|Xs], [X|Ys]) :- prove(Pred, [X]), filter(Pred, Xs, Ys).
filter(Pred, [X|Xs], Ys) :- filter(Pred, Xs, Ys).
764デフォルトの名無しさん
2014/09/18(木) 21:27:49.66ID:fQdBdw40765デフォルトの名無しさん
2014/09/19(金) 04:57:53.94ID:fVs2kyBw >>762
実際に使うのは、repeatを伴う入力処理の場合に限られると思うが
年齢(大田,33).
年齢(神戸,25).
年齢(下山,40).
・・・
で40歳が現れるまでの年齢リストを得たい場合も、
?- findall(_名前,(年齢(_名前,_年齢),(_年齢=40,!,fail;true)),_年齢リスト).
と書く。一般にこの問題が表面に出ないのは、普通は、
?- findall((_名前,_年齢),年齢(_名前,_年齢),L), ・・・・
と一旦、全年齢データをリストに変換してから、処理をするから。
実際に使うのは、repeatを伴う入力処理の場合に限られると思うが
年齢(大田,33).
年齢(神戸,25).
年齢(下山,40).
・・・
で40歳が現れるまでの年齢リストを得たい場合も、
?- findall(_名前,(年齢(_名前,_年齢),(_年齢=40,!,fail;true)),_年齢リスト).
と書く。一般にこの問題が表面に出ないのは、普通は、
?- findall((_名前,_年齢),年齢(_名前,_年齢),L), ・・・・
と一旦、全年齢データをリストに変換してから、処理をするから。
766デフォルトの名無しさん
2014/09/19(金) 04:59:58.17ID:fVs2kyBw767デフォルトの名無しさん
2014/09/19(金) 07:51:22.98ID:fVs2kyBw % カットの話題から逸れるが、設計が適切とは言い難いデータベースの集約問題。
% 駒場東大前から下北沢までの距離を求めなさい
井の頭線(渋谷,500).
井の頭線(神泉,900).
井の頭線(駒場東大前,1000).
井の頭線(池ノ上,600).
井の頭線(下北沢,500).
井の頭線(新代田,東松原,500).
駒場東大前から下北沢までの距離(_距離) :-
findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),L),
駒場東大前までを読み飛ばす(L,L2),
駒場東大前から下北沢までの距離(L2,_距離).
駒場東大前までを読み飛ばす([(駒場東大前,_次の駅までの距離)|R],[(駒場東大前,_次の駅までの距離)|R]).
駒場東大前までを読み飛ばす([_|R1],R2) :-
駒場東大前までを読み飛ばす(R1,R2).
駒場東大前から下北沢までの距離([(下北沢,_)|_],0).
駒場東大前から下北沢までの距離([(_,_次の駅までの距離)|R],_下北沢までの距離) :-
駒場東大前から下北沢までの距離(R,_次の駅から下北沢までの距離),
_下北沢までの距離 is _次の駅までの距離 + _次の駅から下北沢までの距離.
% 駒場東大前から下北沢までの距離を求めなさい
井の頭線(渋谷,500).
井の頭線(神泉,900).
井の頭線(駒場東大前,1000).
井の頭線(池ノ上,600).
井の頭線(下北沢,500).
井の頭線(新代田,東松原,500).
駒場東大前から下北沢までの距離(_距離) :-
findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),L),
駒場東大前までを読み飛ばす(L,L2),
駒場東大前から下北沢までの距離(L2,_距離).
駒場東大前までを読み飛ばす([(駒場東大前,_次の駅までの距離)|R],[(駒場東大前,_次の駅までの距離)|R]).
駒場東大前までを読み飛ばす([_|R1],R2) :-
駒場東大前までを読み飛ばす(R1,R2).
駒場東大前から下北沢までの距離([(下北沢,_)|_],0).
駒場東大前から下北沢までの距離([(_,_次の駅までの距離)|R],_下北沢までの距離) :-
駒場東大前から下北沢までの距離(R,_次の駅から下北沢までの距離),
_下北沢までの距離 is _次の駅までの距離 + _次の駅から下北沢までの距離.
768デフォルトの名無しさん
2014/09/19(金) 20:54:01.75ID:ClkAEpx3 >>765.766
やはり「論理プログラミングの持つ本質的な単純明快さを見失っている(>>762)」みたいだね
Prolog だと述語定義の並びは論理和を意味する
つまり、そのコードの意味は 年齢(大田,33) ∨ 年齢(神戸,25) ∨ 年齢(下山,40) になる
そして論理式には交換律 A ∨ B ≡ B ∨ A があるから、述語定義の並びに論理的な意味は無い
もし順序性を表現したいのであれば、以下のように順序性を明示的に書かなければならない
年齢(大田, 33).
年齢(神戸, 25).
年齢(下山, 40).
順序(大田, 神戸).
順序(神戸, 下山).
あるいは述語「年齢」に「次の人物」または「順序番号」を付加してもかまわない
年齢(大田, 33, 神戸).
年齢(神戸, 25, 下山).
年齢(下山, 40, end_of_list).
または
年齢(大田, 33, 1).
年齢(神戸, 25, 2).
年齢(下山, 40, 3).
これら以外にも、人物リストであれば、人物名の「ふりがな」も順序性を表す情報となりえる
また、人物リストそのものを表現することが目的であれば、直接それを述語として定義すればいい
人物リスト([年齢(大田, 33), 年齢(神戸, 25), 年齢(下山, 40)]).
どれが適切かは、アプリケーションによりけり(=ケースバイケース)になる
やはり「論理プログラミングの持つ本質的な単純明快さを見失っている(>>762)」みたいだね
Prolog だと述語定義の並びは論理和を意味する
つまり、そのコードの意味は 年齢(大田,33) ∨ 年齢(神戸,25) ∨ 年齢(下山,40) になる
そして論理式には交換律 A ∨ B ≡ B ∨ A があるから、述語定義の並びに論理的な意味は無い
もし順序性を表現したいのであれば、以下のように順序性を明示的に書かなければならない
年齢(大田, 33).
年齢(神戸, 25).
年齢(下山, 40).
順序(大田, 神戸).
順序(神戸, 下山).
あるいは述語「年齢」に「次の人物」または「順序番号」を付加してもかまわない
年齢(大田, 33, 神戸).
年齢(神戸, 25, 下山).
年齢(下山, 40, end_of_list).
または
年齢(大田, 33, 1).
年齢(神戸, 25, 2).
年齢(下山, 40, 3).
これら以外にも、人物リストであれば、人物名の「ふりがな」も順序性を表す情報となりえる
また、人物リストそのものを表現することが目的であれば、直接それを述語として定義すればいい
人物リスト([年齢(大田, 33), 年齢(神戸, 25), 年齢(下山, 40)]).
どれが適切かは、アプリケーションによりけり(=ケースバイケース)になる
769デフォルトの名無しさん
2014/09/19(金) 21:33:32.57ID:ClkAEpx3 >>767
これもまた >>765 と同様に論理的ではないデータベース設計の例だね
駅間距離を「(ある駅と駅との間の)接続関係」および「関係に伴う属性」として
論理的にデータベースを設計すると、以下のようになる
井の頭線の駅(渋谷).
井の頭線の駅(神泉).
井の頭線の駅(駒場東大前).
井の頭線の駅(池ノ上).
井の頭線の駅(下北沢).
井の頭線の駅(新代田).
井の頭線の駅(東松原).
井の頭線の駅間距離(渋谷, 神泉, 500).
井の頭線の駅間距離(神泉, 駒場東大前 , 900).
井の頭線の駅間距離(駒場東大前, 池ノ上, 1000).
井の頭線の駅間距離(池ノ上, 下北沢 , 600).
井の頭線の駅間距離(下北沢, 新代田, 500).
井の頭線の駅間距離(新代田, 東松原, 500).
ここで、鉄道路線が駅を頂点とする無向グラフとしてモデル化されることに気が付けば、
述語「井の頭線の駅」がグラフの頂点を、述語「井の頭線の駅間距離」がグラフの辺を
表していることが、直感として理解できるはずだ
これもまた >>765 と同様に論理的ではないデータベース設計の例だね
駅間距離を「(ある駅と駅との間の)接続関係」および「関係に伴う属性」として
論理的にデータベースを設計すると、以下のようになる
井の頭線の駅(渋谷).
井の頭線の駅(神泉).
井の頭線の駅(駒場東大前).
井の頭線の駅(池ノ上).
井の頭線の駅(下北沢).
井の頭線の駅(新代田).
井の頭線の駅(東松原).
井の頭線の駅間距離(渋谷, 神泉, 500).
井の頭線の駅間距離(神泉, 駒場東大前 , 900).
井の頭線の駅間距離(駒場東大前, 池ノ上, 1000).
井の頭線の駅間距離(池ノ上, 下北沢 , 600).
井の頭線の駅間距離(下北沢, 新代田, 500).
井の頭線の駅間距離(新代田, 東松原, 500).
ここで、鉄道路線が駅を頂点とする無向グラフとしてモデル化されることに気が付けば、
述語「井の頭線の駅」がグラフの頂点を、述語「井の頭線の駅間距離」がグラフの辺を
表していることが、直感として理解できるはずだ
770769
2014/09/19(金) 22:28:08.91ID:ClkAEpx3771デフォルトの名無しさん
2014/09/19(金) 22:53:53.05ID:fVs2kyBw 設計が適切とは言い難いデータベース。
リレーショナルデータベースをそのまま述語として写した場合にしばしば
現れる。あるいは何か示されたことをPrologデータベースとしてそのまま
写し取った場合。
以下のように書き換えられればもちろんよい。
井の頭線(渋谷,神泉,500).
井の頭線(神泉,駒場東大前,900).
井の頭線(駒場東大前,池ノ上,1000).
井の頭線(池ノ上,下北沢,600).
井の頭線(下北沢,新代田,500).
駒場東大前から下北沢までの距離(_距離) :-
駒場東大前から下北沢までの距離(駒場東大前,_距離).
駒場東大前から下北沢までの距離(下北沢,0).
駒場東大前から下北沢までの距離(_駅,_距離) :-
井の頭線(_駅,_次の駅,_次の駅までの距離),
駒場東大前から下北沢までの距離(_次の駅,_次の駅から下北沢までの距離),
_距離 is _次の駅から下北沢までの距離 + _次の駅までの距離.
リレーショナルデータベースをそのまま述語として写した場合にしばしば
現れる。あるいは何か示されたことをPrologデータベースとしてそのまま
写し取った場合。
以下のように書き換えられればもちろんよい。
井の頭線(渋谷,神泉,500).
井の頭線(神泉,駒場東大前,900).
井の頭線(駒場東大前,池ノ上,1000).
井の頭線(池ノ上,下北沢,600).
井の頭線(下北沢,新代田,500).
駒場東大前から下北沢までの距離(_距離) :-
駒場東大前から下北沢までの距離(駒場東大前,_距離).
駒場東大前から下北沢までの距離(下北沢,0).
駒場東大前から下北沢までの距離(_駅,_距離) :-
井の頭線(_駅,_次の駅,_次の駅までの距離),
駒場東大前から下北沢までの距離(_次の駅,_次の駅から下北沢までの距離),
_距離 is _次の駅から下北沢までの距離 + _次の駅までの距離.
772デフォルトの名無しさん
2014/09/19(金) 23:06:13.46ID:ClkAEpx3 >>771
採点すると50点だな
まず、一般的な「ある2つの駅間の距離」を述語として定義し、
それを使って具体的な述語「駒場東大前から下北沢までの距離」を定義するという、
「構造化プログラミング」のアプローチが望ましい
駒場東大前から下北沢までの距離(_距離) :-
ある2つの駅間の距離(駒場東大前, 下北沢, _距離).
判定:課題の再提出を要す
採点すると50点だな
まず、一般的な「ある2つの駅間の距離」を述語として定義し、
それを使って具体的な述語「駒場東大前から下北沢までの距離」を定義するという、
「構造化プログラミング」のアプローチが望ましい
駒場東大前から下北沢までの距離(_距離) :-
ある2つの駅間の距離(駒場東大前, 下北沢, _距離).
判定:課題の再提出を要す
773デフォルトの名無しさん
2014/09/19(金) 23:13:52.01ID:fVs2kyBw >>772
それは単に抽象プログラミングでしかない。
それは単に抽象プログラミングでしかない。
774デフォルトの名無しさん
2014/09/19(金) 23:22:26.65ID:8TBQk5yL 大学の演習で作るprolog処理系だと、バックトラックじゃなくて、節の(ユニフィケーションの変数のバインドの)展開だからカットの実装の困難さがいまいち理解できなくて困る
775デフォルトの名無しさん
2014/09/19(金) 23:43:22.71ID:ClkAEpx3776デフォルトの名無しさん
2014/09/20(土) 00:04:57.96ID:ReqVJHou >>774
メタインタプリタ/部分評価(=最適化)/プログラム変換(例:ループ融合)のように、
Prologプログラミングの対象が(データではなく)Prologプログラムそのものであった場合、
カットを含む副作用を伴う述語の形式的な定義は技術的な難問になる
メタインタプリタ/部分評価(=最適化)/プログラム変換(例:ループ融合)のように、
Prologプログラミングの対象が(データではなく)Prologプログラムそのものであった場合、
カットを含む副作用を伴う述語の形式的な定義は技術的な難問になる
777773
2014/09/20(土) 07:35:27.46ID:lJJn8OIz778デフォルトの名無しさん
2014/09/20(土) 08:01:21.59ID:lJJn8OIz findall/3の奇妙なカット処理問題が重要なのは、このカットを他の述語で置き換えることが
不可能なことを理解することによって、カットの意味の理解が一段進むと考えられるからだ。
この事例ほどにカットを直観できるものは他にないと思う。
不可能なことを理解することによって、カットの意味の理解が一段進むと考えられるからだ。
この事例ほどにカットを直観できるものは他にないと思う。
779デフォルトの名無しさん
2014/09/22(月) 07:30:22.65ID:8Y/Ncwny >>775
% Prolog 抽象プログラミングの例。
% 具象プログラミングでは述語名に現れていた情報が引数に移動する。
%
% 駒場東大前から下北沢までの距離を求めなさい
隣接する駅間の距離(井の頭線,渋谷,神泉,500).
隣接する駅間の距離(井の頭線,神泉,駒場東大前,900).
隣接する駅間の距離(井の頭線,駒場東大前,池ノ上,1000).
隣接する駅間の距離(井の頭線,池ノ上,下北沢,600).
隣接する駅間の距離(井の頭線,下北沢,新代田,500).
井の頭線の駒場東大前から下北沢までの距離(_井の頭線の駒場東大前から下北沢までの距離) :-
二駅間の距離(井の頭線,駒場東大前,下北沢,_井の頭線の駒場東大前から下北沢までの距離).
二駅間の距離(_,_到達駅,_到達駅,0).
二駅間の距離(_路線,_駅,_到達駅,_到達駅までの距離) :-
隣接する駅間の距離(_路線,_駅,_次の駅,_次の駅までの距離),
二駅間の距離(_路線,_次の駅,_到達駅,_次の駅から到達駅までの距離),
_到達駅までの距離 is _次の駅から到達駅での距離 + _次の駅までの距離.
% Prolog 抽象プログラミングの例。
% 具象プログラミングでは述語名に現れていた情報が引数に移動する。
%
% 駒場東大前から下北沢までの距離を求めなさい
隣接する駅間の距離(井の頭線,渋谷,神泉,500).
隣接する駅間の距離(井の頭線,神泉,駒場東大前,900).
隣接する駅間の距離(井の頭線,駒場東大前,池ノ上,1000).
隣接する駅間の距離(井の頭線,池ノ上,下北沢,600).
隣接する駅間の距離(井の頭線,下北沢,新代田,500).
井の頭線の駒場東大前から下北沢までの距離(_井の頭線の駒場東大前から下北沢までの距離) :-
二駅間の距離(井の頭線,駒場東大前,下北沢,_井の頭線の駒場東大前から下北沢までの距離).
二駅間の距離(_,_到達駅,_到達駅,0).
二駅間の距離(_路線,_駅,_到達駅,_到達駅までの距離) :-
隣接する駅間の距離(_路線,_駅,_次の駅,_次の駅までの距離),
二駅間の距離(_路線,_次の駅,_到達駅,_次の駅から到達駅までの距離),
_到達駅までの距離 is _次の駅から到達駅での距離 + _次の駅までの距離.
780デフォルトの名無しさん
2014/09/26(金) 11:44:22.80ID:ZJZ/lXfS Prologトリビア探検隊のなく頃に 初心者殺し編
https://sicstus.sics.se/sicstus/docs/4.3.0/html/sicstus/Glossary.html
>argument
> See predicate, structure, and arity.
>arity
> The arity of a structure is its number of arguments. For example,
> the structure customer(jones,85) has an arity of 2.
:
>compound term
> A compound term is a term that is an atom together with one or more arguments.
:
> Compound terms are recognized by the built-in predicate compound/1.
:
>string
:
>subterm selector
:
「structure」は「compound term」の古称(ゾンビ)
https://sicstus.sics.se/sicstus/docs/4.3.0/html/sicstus/Glossary.html
>argument
> See predicate, structure, and arity.
>arity
> The arity of a structure is its number of arguments. For example,
> the structure customer(jones,85) has an arity of 2.
:
>compound term
> A compound term is a term that is an atom together with one or more arguments.
:
> Compound terms are recognized by the built-in predicate compound/1.
:
>string
:
>subterm selector
:
「structure」は「compound term」の古称(ゾンビ)
781デフォルトの名無しさん
2014/10/01(水) 13:34:17.52ID:cI87Gfj0 >>772
単に部分的に抽象化しただけだと、
駒場東大前から下北沢までの距離(_距離) :-
ある2つの駅間の距離(駒場東大前, 下北沢, _距離).
ある2つの駅間の距離(_到達駅, _到達駅, 0) :- !.
ある2つの駅間の距離(_駅_1,_到達駅, _距離) :-
井の頭線の駅間距離(_駅_1, _駅_2, _駅間距離),
ある2つの駅間の距離(_駅_2, _到達駅, _距離_2),
_距離 is _距離_2 + _駅間距離.
となって、 ある2つの駅間の距離/3 という抽象定義の中に具体的な副目標、
井の頭線の駅間距離/3 が現れて設計は破綻する。それで>>779に示したように、
引数側に _路線 を設けて、井の頭線を移動する必要が生じる。
ここら当たりは、抽象プログラミングの弱点であって、常にこのような見直し
を怠ることができない。一方、具象的なプログラミングに於いてはこのような
設計変更は良かれ悪しかれ、ほとんど起こらない。
単に部分的に抽象化しただけだと、
駒場東大前から下北沢までの距離(_距離) :-
ある2つの駅間の距離(駒場東大前, 下北沢, _距離).
ある2つの駅間の距離(_到達駅, _到達駅, 0) :- !.
ある2つの駅間の距離(_駅_1,_到達駅, _距離) :-
井の頭線の駅間距離(_駅_1, _駅_2, _駅間距離),
ある2つの駅間の距離(_駅_2, _到達駅, _距離_2),
_距離 is _距離_2 + _駅間距離.
となって、 ある2つの駅間の距離/3 という抽象定義の中に具体的な副目標、
井の頭線の駅間距離/3 が現れて設計は破綻する。それで>>779に示したように、
引数側に _路線 を設けて、井の頭線を移動する必要が生じる。
ここら当たりは、抽象プログラミングの弱点であって、常にこのような見直し
を怠ることができない。一方、具象的なプログラミングに於いてはこのような
設計変更は良かれ悪しかれ、ほとんど起こらない。
783デフォルトの名無しさん
2014/10/31(金) 21:05:44.19ID:g6D744er すいません。教えてください。
prologでconnect4のルールを実装しようとしています。
connect4はこことかで遊べます。
http://www.connectfour.org/connect-4-online.php
途中までコードを書いたのですが上手く動いてくれません。
私のコードをデバッグしてもらえないでしょうか。
prologでconnect4のルールを実装しようとしています。
connect4はこことかで遊べます。
http://www.connectfour.org/connect-4-online.php
途中までコードを書いたのですが上手く動いてくれません。
私のコードをデバッグしてもらえないでしょうか。
784783
2014/10/31(金) 21:07:15.47ID:g6D744er 二重リストで盤面を表す。
get_atでリストのN番目の要素を返す。
get_stoneでBOARDの(X,Y)の位置にある石を返す。盤の外を指定したときは3を返す。
straightで連続した石の数を数える。DX,DYは連続した石を探索する方向。
よろしくお願いします。
board([[],[],[],[],[],[],[]]).
myboard([[1,2],[1,1],[1,1,1],[1,1,1,2],[],[],[1,2,1]]).
get_at(_,[],_):- fail.
get_at(0,[X|_],X).
get_at(N,[_|Ls],Y):-
N1 is N -1,
get_at(N1,Ls,Y).
get_stone(_,X,_,3):- X<0,!.
get_stone(_,X,_,3):- 6<X,!.
get_stone(_,_,Y,3):- Y<0,!.
get_stone(BOARD,X,Y,0):-
get_at(X,BOARD,Xs),
length(Xs,L),
Y >= L,!.
get_stone(BOARD,X,Y,S):-
get_at(X,BOARD,Xs),
get_at(Y,Xs,S),!.
straight(BOARD,X,Y,_,_,S,0):-
get_stone(BOARD,X,Y,S1),
S1 \== S,!.
straight(BOARD,X,Y,DX,DY,Stn,Len):-
X1 is X + DX,
Y1 is Y + DY,
Len1 is Len + 1,
straight(BOARD,X1,Y1,DX,DY,Stn,Len1),!.
get_atでリストのN番目の要素を返す。
get_stoneでBOARDの(X,Y)の位置にある石を返す。盤の外を指定したときは3を返す。
straightで連続した石の数を数える。DX,DYは連続した石を探索する方向。
よろしくお願いします。
board([[],[],[],[],[],[],[]]).
myboard([[1,2],[1,1],[1,1,1],[1,1,1,2],[],[],[1,2,1]]).
get_at(_,[],_):- fail.
get_at(0,[X|_],X).
get_at(N,[_|Ls],Y):-
N1 is N -1,
get_at(N1,Ls,Y).
get_stone(_,X,_,3):- X<0,!.
get_stone(_,X,_,3):- 6<X,!.
get_stone(_,_,Y,3):- Y<0,!.
get_stone(BOARD,X,Y,0):-
get_at(X,BOARD,Xs),
length(Xs,L),
Y >= L,!.
get_stone(BOARD,X,Y,S):-
get_at(X,BOARD,Xs),
get_at(Y,Xs,S),!.
straight(BOARD,X,Y,_,_,S,0):-
get_stone(BOARD,X,Y,S1),
S1 \== S,!.
straight(BOARD,X,Y,DX,DY,Stn,Len):-
X1 is X + DX,
Y1 is Y + DY,
Len1 is Len + 1,
straight(BOARD,X1,Y1,DX,DY,Stn,Len1),!.
785デフォルトの名無しさん
2014/10/31(金) 22:56:49.16ID:uqHhdnYm >>783
1) 盤のデータ構造に一貫性がない
初期状態と思われる述語 board/2 を見ると、X軸では長さ 7 の固定長配列を表現しているが、
もう一つの盤 myboard/1 を見ると可変長配列で表現している
盤はある定数を持つ2次元配列なのだから、X軸とY軸の表現方法は一貫性を持つべき
2) 石の表現が適切ではない
石にはプレーヤの石とコンピュータの石の2種類があり、おそらくそれらを 1 と 2 という
整数で表現している
Prolog であれば文字アトムがあるから、それらは player と computer で表現できる
タイピングが面倒と感じたなら、p と c でもかまわない
たとえば Prolog と同じ動的型付け言語の Ruby ならば、
まよわずシンボル :player と :computer で表現する発想になっていたはずだ
あるいは静的型付け言語の Standard ML であれば、以下に示す直和型として定義する
datatype stone = Player | Computer
対象とする概念に応じて適切なデータ表現を選択するのは、
(Prolog に限らず)あらゆる言語におけるプログラミングの基本だ
3) 値域の検査に一貫性がない
座標値について、述語 get_at/3 では上限だけ検査して下限を検査していない(もし N が負であれば?)
同様に述語 get_stone/4 ではY軸の座標値について上限だけが検査されていない
検査しない方針ならそれどよし、検査するならするで想定できるすべてのケースを検査すべき
いきあたりばったりのコーディングはコードを品質させ、デバッグを難しくする要因になる
(長いので、次レス以降へ続く)
1) 盤のデータ構造に一貫性がない
初期状態と思われる述語 board/2 を見ると、X軸では長さ 7 の固定長配列を表現しているが、
もう一つの盤 myboard/1 を見ると可変長配列で表現している
盤はある定数を持つ2次元配列なのだから、X軸とY軸の表現方法は一貫性を持つべき
2) 石の表現が適切ではない
石にはプレーヤの石とコンピュータの石の2種類があり、おそらくそれらを 1 と 2 という
整数で表現している
Prolog であれば文字アトムがあるから、それらは player と computer で表現できる
タイピングが面倒と感じたなら、p と c でもかまわない
たとえば Prolog と同じ動的型付け言語の Ruby ならば、
まよわずシンボル :player と :computer で表現する発想になっていたはずだ
あるいは静的型付け言語の Standard ML であれば、以下に示す直和型として定義する
datatype stone = Player | Computer
対象とする概念に応じて適切なデータ表現を選択するのは、
(Prolog に限らず)あらゆる言語におけるプログラミングの基本だ
3) 値域の検査に一貫性がない
座標値について、述語 get_at/3 では上限だけ検査して下限を検査していない(もし N が負であれば?)
同様に述語 get_stone/4 ではY軸の座標値について上限だけが検査されていない
検査しない方針ならそれどよし、検査するならするで想定できるすべてのケースを検査すべき
いきあたりばったりのコーディングはコードを品質させ、デバッグを難しくする要因になる
(長いので、次レス以降へ続く)
786デフォルトの名無しさん
2014/10/31(金) 23:16:28.31ID:uqHhdnYm (>>785 の続き)
まず >>785 のタイプミスを訂正
X:いきあたりばったりのコーディングはコードを品質させ、
O:いきあたりばったりのコーディングはコード品質を悪化させ、
--
4) fail の使用が不適切
値の検査エラーを fail として扱っているが、論理型言語だと fail は(エラーではなく)偽という制御を意味する
このコードでは想定しない値、つまりバグの検出を意図していると思われるから、fail の代わりに abort を使う
get_at(_,[],_):- writeln('Unexpected index'), abort.
get_stone(_,X,_,3):- X<0, writeln('Out of range'(x = X)), abort.
fail だと Prolog はバックトラックを試みてしまうからデバッグが困難になるけど、
abort を使えばプログラムの実行を中止して一気にインタプリタのトップレベルへ復帰(大域脱出)できる
全般的な感想として、1)..3) を見るに (Prolog 以前に)一般的なプログラミングの基礎が身に付いていないと思う
おそらく集合理論言語スレの 1 だと思うけど、大学で情報系を専攻していたのなら情けない結果だ
学生時代に遊んでいたのか、当時はできたけど今はその感覚が戻っていないだけなのか、わからないけどね
現状のレベルでは、言語処理系を自作するなんてのは、夢物語か妄想のたぐいと判断せざるをえない
まず >>785 のタイプミスを訂正
X:いきあたりばったりのコーディングはコードを品質させ、
O:いきあたりばったりのコーディングはコード品質を悪化させ、
--
4) fail の使用が不適切
値の検査エラーを fail として扱っているが、論理型言語だと fail は(エラーではなく)偽という制御を意味する
このコードでは想定しない値、つまりバグの検出を意図していると思われるから、fail の代わりに abort を使う
get_at(_,[],_):- writeln('Unexpected index'), abort.
get_stone(_,X,_,3):- X<0, writeln('Out of range'(x = X)), abort.
fail だと Prolog はバックトラックを試みてしまうからデバッグが困難になるけど、
abort を使えばプログラムの実行を中止して一気にインタプリタのトップレベルへ復帰(大域脱出)できる
全般的な感想として、1)..3) を見るに (Prolog 以前に)一般的なプログラミングの基礎が身に付いていないと思う
おそらく集合理論言語スレの 1 だと思うけど、大学で情報系を専攻していたのなら情けない結果だ
学生時代に遊んでいたのか、当時はできたけど今はその感覚が戻っていないだけなのか、わからないけどね
現状のレベルでは、言語処理系を自作するなんてのは、夢物語か妄想のたぐいと判断せざるをえない
787デフォルトの名無しさん
2014/11/01(土) 01:37:40.45ID:cR58jgTn straight の定義が妙だね。
対象のマスに期待する石がなかった場合、 Len は 0 になる。
それ以外の場合、 Len + 1 を代入した Len1 を使って再帰してる。
でもこれをやるには、 Len は既に数値でなきゃいけない。
しかも、再帰先でこの Len1 と 0 との単一化が成功するには、 Len は負の数でなきゃいけない。
対象のマスに期待する石がなかった場合、 Len は 0 になる。
それ以外の場合、 Len + 1 を代入した Len1 を使って再帰してる。
でもこれをやるには、 Len は既に数値でなきゃいけない。
しかも、再帰先でこの Len1 と 0 との単一化が成功するには、 Len は負の数でなきゃいけない。
788783
2014/11/01(土) 09:43:11.50ID:EdETwwEo >>787
Len1 = Len + 1 は Len1 = Len - 1の間違いですね。
でもこれを直しても
ERROR: straight/7: Arguments are not sufficiently instantiated
って言われちゃいます。
なにか根本的に間違ってるような気がします。
Len1 = Len + 1 は Len1 = Len - 1の間違いですね。
でもこれを直しても
ERROR: straight/7: Arguments are not sufficiently instantiated
って言われちゃいます。
なにか根本的に間違ってるような気がします。
789デフォルトの名無しさん
2014/11/01(土) 10:42:41.34ID:cR58jgTn それを実行するには、先に Len に数値が代入されてなきゃいけないの。
is の右辺の式では未確定な変数は使えない。
この再帰だと、 Len より Len1 のが先に確定するよね。
だから再帰呼び出しのあとで Len を計算するって形にすればいいと思うけど。
is の右辺の式では未確定な変数は使えない。
この再帰だと、 Len より Len1 のが先に確定するよね。
だから再帰呼び出しのあとで Len を計算するって形にすればいいと思うけど。
790783
2014/11/01(土) 17:43:33.36ID:EdETwwEo >>789
こうですか?確かに動いてるっぽい。
straight(BOARD,X,Y,DX,DY,Stn,Len):-
X1 is X + DX,
Y1 is Y + DY,
straight(BOARD,X1,Y1,DX,DY,Stn,Len1),
Len is Len1 + 1,!.
うーん、何となくわかるけど、動く場合と動かない場合の違いがイマイチはっきりしないw
非決定性ぽく動くのがprologの特徴なのかと思ってました。
こうですか?確かに動いてるっぽい。
straight(BOARD,X,Y,DX,DY,Stn,Len):-
X1 is X + DX,
Y1 is Y + DY,
straight(BOARD,X1,Y1,DX,DY,Stn,Len1),
Len is Len1 + 1,!.
うーん、何となくわかるけど、動く場合と動かない場合の違いがイマイチはっきりしないw
非決定性ぽく動くのがprologの特徴なのかと思ってました。
791デフォルトの名無しさん
2014/11/01(土) 20:43:43.91ID:WwPqiJUs792デフォルトの名無しさん
2014/11/01(土) 22:43:45.21ID:cR58jgTn リスト処理とかなら未確定の変数ばっかりでも動くんだけどね。
数値計算は確定した値での計算にしか対応してない。
その意味で、数値計算はあまり特徴を活かせない分野かな。
数値計算は確定した値での計算にしか対応してない。
その意味で、数値計算はあまり特徴を活かせない分野かな。
794デフォルトの名無しさん
2015/05/12(火) 17:20:17.58ID:11Ddb+Xl Prologトリビア探検隊ニユース
S-Prolog改造仲間を発見した記念カキコ
http://www.skyley.com/news/info_2015050902.html
http://www.skyley.com/products/prolog.html
Skyley Networks / マイコンでProlog
S-Prolog改造仲間を発見した記念カキコ
http://www.skyley.com/news/info_2015050902.html
http://www.skyley.com/products/prolog.html
Skyley Networks / マイコンでProlog
795デフォルトの名無しさん
2015/05/12(火) 17:27:07.88ID:11Ddb+Xl おまけ
地下16階 環境外からのカットで次候補が残る
s(G) :- ( write(+s1), nl ; write(-s1), nl, fail ), G.
s(_) :- write(s2), nl.
| ?- s(( !, fail )).
+s1
s2
yes
※カットの仕様はISOと異なる
地下16階 環境外からのカットで次候補が残る
s(G) :- ( write(+s1), nl ; write(-s1), nl, fail ), G.
s(_) :- write(s2), nl.
| ?- s(( !, fail )).
+s1
s2
yes
※カットの仕様はISOと異なる
796デフォルトの名無しさん
2015/07/23(木) 08:35:16.01ID:vXWRCJsm 最近Prologをはじめたのですが
すごく面白い言語だと思ってます
ただ論理パズルのような制約を満たすタイプは
記述が分かりやすくなって良いのですが
リバーシのように手が進んでいく
選択肢が変化していくタイプのものは
どう書くのが一般的なのでしょうか?
Cでforとifと変数を使うような
手続き型の記述なら分かりますが
それをむりやり翻訳してもわざわざ
Prologを使う意味が薄くなりそうなので
すごく面白い言語だと思ってます
ただ論理パズルのような制約を満たすタイプは
記述が分かりやすくなって良いのですが
リバーシのように手が進んでいく
選択肢が変化していくタイプのものは
どう書くのが一般的なのでしょうか?
Cでforとifと変数を使うような
手続き型の記述なら分かりますが
それをむりやり翻訳してもわざわざ
Prologを使う意味が薄くなりそうなので
797796
2015/07/25(土) 21:40:24.71ID:7KWrg38M あまりに過疎っていて返答がないので
このスレを読んでみたら
サンプルコードを見つけてしまいました
>>646-659
先読みというより局面の遷移が知りたかったのですが
どのみちゲームAIを作るなら先読みは
不可避でしょうからとても参考になります
このスレを読んでみたら
サンプルコードを見つけてしまいました
>>646-659
先読みというより局面の遷移が知りたかったのですが
どのみちゲームAIを作るなら先読みは
不可避でしょうからとても参考になります
798デフォルトの名無しさん
2015/07/26(日) 01:45:28.45ID:Cfg0EpVo 局面を進める(元の局面, 手, 次の局面) :- ...
みたいな述語を定義するようになると思う
みたいな述語を定義するようになると思う
799796
2015/07/26(日) 07:08:05.29ID:X0FzmAov800デフォルトの名無しさん
2015/11/30(月) 16:33:12.27ID:Y0H2lL5r swi-prologで変数を表示させたときに、それがリストである以上の長さになると省略されてしまうのですが、全て表示させるにはどうすればいいですか?
801片山博文MZ ◆T6xkBnTXz7B0
2016/02/22(月) 20:16:05.33ID:C/gFN+RL C++スレから来たProlog初心者の片山博文MZと言います。よろしくお願いします。
C++相談室 part123 [無断転載禁止]・2ch.net
http://peace.2ch.net/test/read.cgi/tech/1456040187/
C++相談室 part123 [無断転載禁止]・2ch.net
http://peace.2ch.net/test/read.cgi/tech/1456040187/
802デフォルトの名無しさん
2016/02/22(月) 20:51:54.70ID:wBlySGY0 Prologにも手を出すのか
Coqは極めたのか?
Coqは極めたのか?
803デフォルトの名無しさん
2016/02/24(水) 07:26:32.54ID:0U45vlYv <背理法>
pと[ q ̄ ]を仮定して矛盾を示す方法
※pを仮定することが重要.この点が対偶証明法と異なり,結論として[ p ̄ ]が導ける場合に限られず,
他の内容でも数学的に矛盾することが示せたら何でもよいので,自由度が大きい.
対偶証明法と背理法
例がいっぱいある↓
http://www.geisya.or.jp/~mwm48961/koukou/cond004.htm
pと[ q ̄ ]を仮定して矛盾を示す方法
※pを仮定することが重要.この点が対偶証明法と異なり,結論として[ p ̄ ]が導ける場合に限られず,
他の内容でも数学的に矛盾することが示せたら何でもよいので,自由度が大きい.
対偶証明法と背理法
例がいっぱいある↓
http://www.geisya.or.jp/~mwm48961/koukou/cond004.htm
804デフォルトの名無しさん
2016/03/18(金) 07:23:29.68ID:J1JYv5tG >>800 以下の組込述語を使います。ここでは10000に変更しましたが、初期値はmax_depth(10)になっています。
?- set_prolog_flag(answer_write_options,[quoted(true),portray(true),max_depth(10000),spacing(next_argument)]).
?- set_prolog_flag(answer_write_options,[quoted(true),portray(true),max_depth(10000),spacing(next_argument)]).
805デフォルトの名無しさん
2016/03/18(金) 07:50:23.52ID:J1JYv5tG >>800 >>804
少し長くなりますが、quoted(true)など他の現在値に変更を加えないようにmax_depthだけを変更するのには、
?- current_prolog_flag(answer_write_options,L),
| select(max_depth(_),L,max_depth(10000),L2),
| set_prolog_flag(answer_write_options,L2).
L = [quoted(true), portray(true), max_depth(10), spacing(next_argument)],
L2 = [quoted(true), portray(true), max_depth(10000), spacing(next_argument)] .
少し長くなりますが、quoted(true)など他の現在値に変更を加えないようにmax_depthだけを変更するのには、
?- current_prolog_flag(answer_write_options,L),
| select(max_depth(_),L,max_depth(10000),L2),
| set_prolog_flag(answer_write_options,L2).
L = [quoted(true), portray(true), max_depth(10), spacing(next_argument)],
L2 = [quoted(true), portray(true), max_depth(10000), spacing(next_argument)] .
806デフォルトの名無しさん
2016/05/01(日) 16:59:58.34ID:tKi6j9CT 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
1y
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
1y
807デフォルトの名無しさん
2016/05/03(火) 23:09:22.63ID:6+0Tfr5q prologでどう答えるのでしょうか
りんご=■
バナナ=■■
いちご=■■■
みかん=■■■■
キウイ=■■■■■
りんご+りんご=バナナ
りんご+バナナ=?
りんご=■
バナナ=■■
いちご=■■■
みかん=■■■■
キウイ=■■■■■
りんご+りんご=バナナ
りんご+バナナ=?
808sage
2016/05/06(金) 16:28:48.46ID:jV9FcJ+5 >>807
fruit.pl
fruit_val(ringo,1).
fruit_val(banana,2).
fruit_val(ichigo,3).
fruit_val(mikan,4).
fruit_val(kiwi,5).
goukei(A,B):-
fruit_val(A,AVal),
fruit_val(B,BVal),
CVal is AVal+BVal,
fruit_val(C,CVal),
write(C).
実行結果:
[1] 20 ?- goukei(ringo,ringo).
banana
true.
[1] 21 ?- goukei(ringo,banana).
ichigo
true.
fruit.pl
fruit_val(ringo,1).
fruit_val(banana,2).
fruit_val(ichigo,3).
fruit_val(mikan,4).
fruit_val(kiwi,5).
goukei(A,B):-
fruit_val(A,AVal),
fruit_val(B,BVal),
CVal is AVal+BVal,
fruit_val(C,CVal),
write(C).
実行結果:
[1] 20 ?- goukei(ringo,ringo).
banana
true.
[1] 21 ?- goukei(ringo,banana).
ichigo
true.
809デフォルトの名無しさん
2016/05/06(金) 19:24:20.00ID:qnyG8iEg810デフォルトの名無しさん
2016/05/06(金) 20:23:27.02ID:ZL7EA8hJ 数の概念って、ペアノの公理系とか?
suc( zero, りんご ).
suc( りんご, バナナ ).
suc( バナナ, いちご ).
suc( いちご, みかん ).
suc( みかん, キウイ ).
add( zero, X, X ) :- !.
add( A, B, C ) :- suc( P, A ), suc( B, N ), add( P, N, C ).
?- add( りんご, バナナ, X ).
X = いちご
suc( zero, りんご ).
suc( りんご, バナナ ).
suc( バナナ, いちご ).
suc( いちご, みかん ).
suc( みかん, キウイ ).
add( zero, X, X ) :- !.
add( A, B, C ) :- suc( P, A ), suc( B, N ), add( P, N, C ).
?- add( りんご, バナナ, X ).
X = いちご
811デフォルトの名無しさん
2016/05/07(土) 09:29:24.35ID:idLmAwju >>810
ありがとうございます。
図々しく欲を言えば、応用範囲が広くなればもっと便利なのです。
数の概念を数学的に理解しすぎるとシンボルグラウティングを経た後の統計処理でプログラムが複雑になりすぎるので
ありがとうございます。
図々しく欲を言えば、応用範囲が広くなればもっと便利なのです。
数の概念を数学的に理解しすぎるとシンボルグラウティングを経た後の統計処理でプログラムが複雑になりすぎるので
812デフォルトの名無しさん
2016/05/07(土) 11:51:33.38ID:LMdi7EDF813デフォルトの名無しさん
2016/05/07(土) 17:29:00.43ID:v072DMKU ホント何がしたいのか分からない
がんばって自力で実装するしかない
がんばって自力で実装するしかない
814デフォルトの名無しさん
2016/05/07(土) 18:15:08.71ID:v072DMKU 072は自分でどうぞ
815デフォルトの名無しさん
2016/05/08(日) 21:27:34.20ID:X4yv1I6s まあPrologに一般的な概念を覚えさせて
具体的問題を個別対応でなく
その応用で一気に解かせたくなる
という気持ちは分かる
でもほとんどの場合そう上手くいかない
フレーム問題みたいなものがあるから
具体的問題を個別対応でなく
その応用で一気に解かせたくなる
という気持ちは分かる
でもほとんどの場合そう上手くいかない
フレーム問題みたいなものがあるから
816デフォルトの名無しさん
2016/05/09(月) 17:43:56.94ID:4nfgQfeQ 論理型言語も圏論と関係あるんですか?
817デフォルトの名無しさん
2016/05/09(月) 23:39:14.35ID:YJQ3jsKC 様相論理を実装しようとするまでは圏論無視してても問題ない
818デフォルトの名無しさん
2016/05/10(火) 02:27:30.00ID:QgY2EPAO 実装した後はどうなりますか?
819808
2016/05/10(火) 18:29:01.20ID:kw95GqYD >>807
ほかの人が言っているようにちょっとやりたいことがわからない(説明不足)けどこういうことかな?
DCGを使った。
ringo(Ret)-->[a],{Ret = ringo}.
banana(Ret)-->[a,a],{Ret = banana}.
ichigo(Ret)-->[a,a,a],{Ret = ichigo}.
mikan(Ret)-->[a,a,a,a],{Ret = mikan}.
kiwi(Ret)-->[a,a,a,a,a],{Ret = kiwi}.
fruit(X)-->ringo(X);banana(X);ichigo(X);mikan(X);kiwi(X).
ringo_ringo([First|Rest])-->ringo(First),ringo(Rest),[].
ringo_banana([First|Rest])-->ringo(First),banana(Rest),[].
fruit_pair([X | Y])-->fruit(X),fruit(Y),[].
main:-
phrase(ringo_ringo(X),RingoRingo,[]),
write(RingoRingo),
write(' '),
write(X),nl,
phrase(ringo_banana(Y),RingoBanana,[]),
write(RingoBanana),
write(' '),
write(Y),nl,
phrase(fruit_pair(Z),[a,a,a,a,a],[]),
write('[a,a,a,a,a] '),
write(Z),nl.
ほかの人が言っているようにちょっとやりたいことがわからない(説明不足)けどこういうことかな?
DCGを使った。
ringo(Ret)-->[a],{Ret = ringo}.
banana(Ret)-->[a,a],{Ret = banana}.
ichigo(Ret)-->[a,a,a],{Ret = ichigo}.
mikan(Ret)-->[a,a,a,a],{Ret = mikan}.
kiwi(Ret)-->[a,a,a,a,a],{Ret = kiwi}.
fruit(X)-->ringo(X);banana(X);ichigo(X);mikan(X);kiwi(X).
ringo_ringo([First|Rest])-->ringo(First),ringo(Rest),[].
ringo_banana([First|Rest])-->ringo(First),banana(Rest),[].
fruit_pair([X | Y])-->fruit(X),fruit(Y),[].
main:-
phrase(ringo_ringo(X),RingoRingo,[]),
write(RingoRingo),
write(' '),
write(X),nl,
phrase(ringo_banana(Y),RingoBanana,[]),
write(RingoBanana),
write(' '),
write(Y),nl,
phrase(fruit_pair(Z),[a,a,a,a,a],[]),
write('[a,a,a,a,a] '),
write(Z),nl.
820808
2016/05/10(火) 18:30:19.34ID:kw95GqYD 実行結果:
[2] 13 ?-
% Updating index for library c:/program files/swipl/library/
% c:/users/koyahata/documents/prolog/fruit2 compiled 0.00 sec, 11 clauses
[2] 13 ?- main.
[a,a] [ringo|ringo]
[a,a,a] [ringo|banana]
[a,a,a,a,a] [ringo|mikan]
true ;
[a,a,a,a,a] [banana|ichigo]
true ;
[a,a,a,a,a] [ichigo|banana]
true ;
[a,a,a,a,a] [mikan|ringo]
true ;
false.
やっつけなのでちょっとリストの作り方おかしいかもしれないけど…
[2] 13 ?-
% Updating index for library c:/program files/swipl/library/
% c:/users/koyahata/documents/prolog/fruit2 compiled 0.00 sec, 11 clauses
[2] 13 ?- main.
[a,a] [ringo|ringo]
[a,a,a] [ringo|banana]
[a,a,a,a,a] [ringo|mikan]
true ;
[a,a,a,a,a] [banana|ichigo]
true ;
[a,a,a,a,a] [ichigo|banana]
true ;
[a,a,a,a,a] [mikan|ringo]
true ;
false.
やっつけなのでちょっとリストの作り方おかしいかもしれないけど…
821808
2016/05/10(火) 18:38:04.23ID:kw95GqYD こういう質問もできるから、これでいいんじゃないの?
[2] 14 ?- phrase(fruit_pair([ringo|banana]),Ret,[]).
Ret = [a, a, a] ;
false.
[2] 15 ?- phrase(fruit_pair([banana|ichigo]),Ret,[]).
Ret = [a, a, a, a, a] ;
false.
[2] 14 ?- phrase(fruit_pair([ringo|banana]),Ret,[]).
Ret = [a, a, a] ;
false.
[2] 15 ?- phrase(fruit_pair([banana|ichigo]),Ret,[]).
Ret = [a, a, a, a, a] ;
false.
822808
2016/05/10(火) 18:40:22.90ID:kw95GqYD こういう質問もできるよ
[2] 16 ?- phrase(fruit_pair([banana|ichigo]),Ret,[]),phrase(fruit_pair(Y),Ret,[]),write(Y).
[ringo|mikan]
Ret = [a, a, a, a, a],
Y = [ringo|mikan] ;
[banana|ichigo]
Ret = [a, a, a, a, a],
Y = [banana|ichigo] ;
[ichigo|banana]
Ret = [a, a, a, a, a],
Y = [ichigo|banana] ;
[mikan|ringo]
Ret = [a, a, a, a, a],
Y = [mikan|ringo] ;
false.
[2] 16 ?- phrase(fruit_pair([banana|ichigo]),Ret,[]),phrase(fruit_pair(Y),Ret,[]),write(Y).
[ringo|mikan]
Ret = [a, a, a, a, a],
Y = [ringo|mikan] ;
[banana|ichigo]
Ret = [a, a, a, a, a],
Y = [banana|ichigo] ;
[ichigo|banana]
Ret = [a, a, a, a, a],
Y = [ichigo|banana] ;
[mikan|ringo]
Ret = [a, a, a, a, a],
Y = [mikan|ringo] ;
false.
823デフォルトの名無しさん
2016/05/10(火) 21:36:21.72ID:STQfDXP5 >>818
実装した様相論理を圏論で表現すると論文を書くときにかっこいい
実装した様相論理を圏論で表現すると論文を書くときにかっこいい
824デフォルトの名無しさん
2016/05/12(木) 02:37:17.88ID:QfZXVCzv 様相論理というのはPrologの拡張ですか?
825デフォルトの名無しさん
2016/05/12(木) 03:50:49.89ID:X1xCMOiV PrologでProlog処理系作って改造すると学部卒研レベルでも様相論理を実装できる
826デフォルトの名無しさん
2016/05/12(木) 07:12:33.29ID:QfZXVCzv 一階述語論理が論理型言語の計算モデルらしいですが、
高階述語論理をモデルとするような言語もあるのですか?
高階述語論理をモデルとするような言語もあるのですか?
827デフォルトの名無しさん
2016/05/17(火) 22:49:38.79ID:ihci1/VL C言語系はenumとswitchがあまり便利ではないから高階関数のようなものが必要だけど
Prologはtermとパターンマッチだけでほぼ満足してしまう
Prologはtermとパターンマッチだけでほぼ満足してしまう
828デフォルトの名無しさん
2016/05/17(火) 22:57:05.36ID:ncaU4ikw >>827
関数型言語なら代数バリアント使いつつ高階関数が必須なんですが
関数型言語なら代数バリアント使いつつ高階関数が必須なんですが
829デフォルトの名無しさん
2016/05/18(水) 01:07:17.80ID:kNiEPZvr mapとか高階関数の定義にバリアント使うけどmapを利用する側はバリアント意識してない
830デフォルトの名無しさん
2016/09/13(火) 00:19:04.93ID:jukzgj+D Prologとオントロジーは相性が良いと思うのですが
それに言及してる本などが少ないのは
あまり実用性がないと思われているのでしょうか?
それに言及してる本などが少ないのは
あまり実用性がないと思われているのでしょうか?
831デフォルトの名無しさん
2016/09/13(火) 23:04:44.72ID:6dgxPkoI 実用性はあるが、実用しようとするとPrologとあまり関係のないインターフェイスが超面倒臭い
インターフェイスの設計まで含んでるのがオントロジーだから、Prologにかぎったことではないが
インターフェイスの設計まで含んでるのがオントロジーだから、Prologにかぎったことではないが
832デフォルトの名無しさん
2016/09/14(水) 08:10:08.95ID:JzjCbHsO Prolog自体が知識ベースだからかも
833デフォルトの名無しさん
2016/09/17(土) 14:03:02.83ID:iKVkomQx >>828
findall/3というSQLのselectに近い組込述語があって、
?- L = [1,2,3],
findall(B,(member(A,L),foo(A,B)),L).
のように使える。これは、リストでなくfoo/1を参照して
?- findall(B,(boo(A),foo(A,B)),L).
とも変化できる。自由度が高い。
それで、map関数にあたるものは、Prologではほとんど使われない。
findall/3というSQLのselectに近い組込述語があって、
?- L = [1,2,3],
findall(B,(member(A,L),foo(A,B)),L).
のように使える。これは、リストでなくfoo/1を参照して
?- findall(B,(boo(A),foo(A,B)),L).
とも変化できる。自由度が高い。
それで、map関数にあたるものは、Prologではほとんど使われない。
834833
2016/09/17(土) 14:05:15.47ID:iKVkomQx 「これは、リストではなくboo/1を参照して」
です。foo/1としたのは間違い。
です。foo/1としたのは間違い。
835デフォルトの名無しさん
2016/09/21(水) 21:43:10.85ID:fpeK+m+E もし + が述語だったら is(A, 1 + 1) は高階述語だったかも?
でも実際は高階述語などではなくただのパターンマッチでいい
でも実際は高階述語などではなくただのパターンマッチでいい
836デフォルトの名無しさん
2016/09/24(土) 05:37:08.07ID:nvb+KqdK Prologだけ機械学習の波に乗れてない……
837デフォルトの名無しさん
2016/09/24(土) 05:50:29.45ID:oYgGfkv1 波に乗るっつうかバックにそういうシステムを置くフロントエンドになるだけじゃね
838デフォルトの名無しさん
2016/09/26(月) 14:53:21.88ID:8iOhZhP3839デフォルトの名無しさん
2016/09/26(月) 16:11:02.20ID:aAF0yNwh prologで微分の導関数(derivative)を求めるというプログラムがネットで幾つかヒットして参考になるのですが、どれも式変換したあとの簡略化をしっかり行っていない(不十分だったりまったくやっていない)
簡略化(例:因数分解→分母分子で同じ部分探して約分)のプログラムやアルゴリズムに関して解説した記事などをご存じの方はいますか?
簡略化(例:因数分解→分母分子で同じ部分探して約分)のプログラムやアルゴリズムに関して解説した記事などをご存じの方はいますか?
840デフォルトの名無しさん
2016/09/26(月) 20:18:06.76ID:IYYjmJRF >>839
記事ではなくて書籍であれば、以下の22章にコード付きの解説がある
・Prologの技芸 : Leon Sterling, Ehud Shapiro, 松田 利夫
https://www.amazon.co.jp/dp/4320097106
章冒頭の概要と詳細目次を書いておく
第22章 方程式を解くプログラム
Prologの応用分野として、極めて自然な分野が記号処理である。
例えば、典型的な記号処理の問題である記号微分のPrologプログラムは、
プログラム3,29に示すように、微分規則を違う構文法で記述したものにすぎない。
本章では、記号方程式を解くプログラムを示す。これは、エジンバラ大学
人工知能学科数理推論研究グループによって開発されたPRESS(PRolog
Equation Solving System)の簡易板である。PRESSは、高校の最高学年の
生徒程度の数学の能力を持つ。
本章の構成は以下の通りである。最初の節では、解法例を示して、方程式の
解法の概要を説明する。残りの4節では、方程式を解くプログラムに実現されている
4つの主要な解法について述べる。
22.1 方程式の解法の概要
22,2 因数分解
22,3 孤立化
22,4 多項式
22.5 同次化
22.6 背景
記事ではなくて書籍であれば、以下の22章にコード付きの解説がある
・Prologの技芸 : Leon Sterling, Ehud Shapiro, 松田 利夫
https://www.amazon.co.jp/dp/4320097106
章冒頭の概要と詳細目次を書いておく
第22章 方程式を解くプログラム
Prologの応用分野として、極めて自然な分野が記号処理である。
例えば、典型的な記号処理の問題である記号微分のPrologプログラムは、
プログラム3,29に示すように、微分規則を違う構文法で記述したものにすぎない。
本章では、記号方程式を解くプログラムを示す。これは、エジンバラ大学
人工知能学科数理推論研究グループによって開発されたPRESS(PRolog
Equation Solving System)の簡易板である。PRESSは、高校の最高学年の
生徒程度の数学の能力を持つ。
本章の構成は以下の通りである。最初の節では、解法例を示して、方程式の
解法の概要を説明する。残りの4節では、方程式を解くプログラムに実現されている
4つの主要な解法について述べる。
22.1 方程式の解法の概要
22,2 因数分解
22,3 孤立化
22,4 多項式
22.5 同次化
22.6 背景
841839
2016/09/28(水) 10:01:23.90ID:6gs0Qv+W >>840
ありがとうございます。該当の文献の英語版を読んでいるのですが多分因数分解は以下のコードだと思います。古い本で→や\等の記号が用いられており勝手に以下と解釈しました。
→ … :-
\ … 差分リスト
↑ … ^
subterm(Term,Term).
subterm(Sub,Term):-compound(Term),functor(Term,F,N),subterm(N,Sub,Term).
subterm(N,Sub,Term):-N>1,N1 is N-1,subterm(N1,Sub,Term).
subterm(N,Sub,Term):-arg(N,Term,Arg),subterm(Sub,Arg).
factorize(A*B,X,[Factors-Rest]):-!,factorize(A,X,[Factors-Factors1]),factorize(B,X,[Factors1,Rest]).
factorize(C,X,[[C|Factors],Factors]):-subterm(X,C),!.
factorize(C,X,[Factors,Factors]).
実行結果は以下となり、うまく因数分解できないのですが、どうすればよいかわかりますか?
1 ?- subterm(X,a*b*(c-d/e)^f).
X = a*b* (c-d/e)^f ;
X = a*b ;
X = a ;
X = b ;
X = (c-d/e)^f ;
X = c-d/e ;
X = c ;
X = d/e ;
X = d ;
X = e ;
X = f ;
false.
4 ?- factorize(x^2+4*x+4,A,x+2).
false.
5 ?- factorize(x^2+4*x+4,A,B).
A = x^2+4*x+4,
B = [[x^2+4*x+4|_G1609], _G1609].
ありがとうございます。該当の文献の英語版を読んでいるのですが多分因数分解は以下のコードだと思います。古い本で→や\等の記号が用いられており勝手に以下と解釈しました。
→ … :-
\ … 差分リスト
↑ … ^
subterm(Term,Term).
subterm(Sub,Term):-compound(Term),functor(Term,F,N),subterm(N,Sub,Term).
subterm(N,Sub,Term):-N>1,N1 is N-1,subterm(N1,Sub,Term).
subterm(N,Sub,Term):-arg(N,Term,Arg),subterm(Sub,Arg).
factorize(A*B,X,[Factors-Rest]):-!,factorize(A,X,[Factors-Factors1]),factorize(B,X,[Factors1,Rest]).
factorize(C,X,[[C|Factors],Factors]):-subterm(X,C),!.
factorize(C,X,[Factors,Factors]).
実行結果は以下となり、うまく因数分解できないのですが、どうすればよいかわかりますか?
1 ?- subterm(X,a*b*(c-d/e)^f).
X = a*b* (c-d/e)^f ;
X = a*b ;
X = a ;
X = b ;
X = (c-d/e)^f ;
X = c-d/e ;
X = c ;
X = d/e ;
X = d ;
X = e ;
X = f ;
false.
4 ?- factorize(x^2+4*x+4,A,x+2).
false.
5 ?- factorize(x^2+4*x+4,A,B).
A = x^2+4*x+4,
B = [[x^2+4*x+4|_G1609], _G1609].
842839
2016/09/28(水) 10:16:30.93ID:6gs0Qv+W すみません差分リストのとこ[Factors-Rest]と[Factors,Rest]が混在してまちがってましたが
[Factors,Rest]の形式に統一しても同じエラーでした。
多分すでに式がA*Bの形式になっている前提で書かれているコードのような…
x^2+4^x+4 → (x+2)^2 の形式には変換できなそうですね。
[Factors,Rest]の形式に統一しても同じエラーでした。
多分すでに式がA*Bの形式になっている前提で書かれているコードのような…
x^2+4^x+4 → (x+2)^2 の形式には変換できなそうですね。
843デフォルトの名無しさん
2016/11/17(木) 10:52:19.73ID:u2Ucvcf0 >>70
SWI-Prologだと、read_line_to_codes/2というような述語があります。第一引数に
ストリームがきます。
?- read_line_to_codes(user_input,X).
: qaz
X = [113, 97, 122].
となります。
get_line(Stream,Line) :-
read_line_to_codes(Stream,L),
atom_codes(Line,L).
という簡単な定義でピリオドなし入力を定義できます。
SWI-Prologだと、read_line_to_codes/2というような述語があります。第一引数に
ストリームがきます。
?- read_line_to_codes(user_input,X).
: qaz
X = [113, 97, 122].
となります。
get_line(Stream,Line) :-
read_line_to_codes(Stream,L),
atom_codes(Line,L).
という簡単な定義でピリオドなし入力を定義できます。
844デフォルトの名無しさん
2016/12/03(土) 10:33:29.10ID:z6/kqn1c 実は多くのプログラマが最初は read を使ってデータ入力するプログラムを
書くのですが、実際に利用する人たちに拒否されます。それで、この
get_line のような行入力が必要になるのですが、get_char を使って再帰的に
述語を書くのことはハードルとなります。それでこの read_line_to_code の
ような述語があるのであれば、広く知らしてあげる必要があります。
書くのですが、実際に利用する人たちに拒否されます。それで、この
get_line のような行入力が必要になるのですが、get_char を使って再帰的に
述語を書くのことはハードルとなります。それでこの read_line_to_code の
ような述語があるのであれば、広く知らしてあげる必要があります。
845デフォルトの名無しさん
2016/12/03(土) 13:28:23.04ID:YH7aKbNh846デフォルトの名無しさん
2016/12/03(土) 14:44:47.05ID:rctUeRlC >>845
ライブラリというと、readln/1 というのがあるにはある。
?- readln(X).
:| abc
X = [abc].
で一見うまくいく。ところが
?- readln(X).
:| abc def
X = [abc,dec].
と余計なことをしてしまう。全体をアトムとして欲しいわけです。
それで使われない。
ライブラリというと、readln/1 というのがあるにはある。
?- readln(X).
:| abc
X = [abc].
で一見うまくいく。ところが
?- readln(X).
:| abc def
X = [abc,dec].
と余計なことをしてしまう。全体をアトムとして欲しいわけです。
それで使われない。
847デフォルトの名無しさん
2016/12/04(日) 05:31:31.27ID:q5ZWXjRo848デフォルトの名無しさん
2016/12/04(日) 20:17:09.28ID:q5ZWXjRo SWI-Prologに関する限り、入力よりも出力の方が変というか使いにくい。
format述語のことだけれど。
format述語のことだけれど。
849デフォルトの名無しさん
2016/12/05(月) 20:24:12.86ID:MLt2Eg7b SWI-Prologの問題を超えて、この処理系のマニュアルが改善
されれば、Prologはもっと普及すると思う。
あまりにも、個々の実例が少なすぎる。多くのプログラマは
実例を見比べてその違いから、問題を理解するという方法を
身に付けているが、その方法に沿った資料に全くなっていない。
SWI-Prologが現在のPrologを代表するものに成長しているの
だから、この部分に人を割いて欲しい。
されれば、Prologはもっと普及すると思う。
あまりにも、個々の実例が少なすぎる。多くのプログラマは
実例を見比べてその違いから、問題を理解するという方法を
身に付けているが、その方法に沿った資料に全くなっていない。
SWI-Prologが現在のPrologを代表するものに成長しているの
だから、この部分に人を割いて欲しい。
■ このスレッドは過去ログ倉庫に格納されています
