Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2010/11/06(土) 13:00:56654デフォルトの名無しさん
2013/03/21(木) 00:23:36.01 >>653
何か間違っていますね。 ! を削りましょう。そうすると、
着手候補の取り出し(_枝切り,_評価_着手_局面ならび_2,_評価,_着手,_局面2) :-
length(L0,_枝切り),
append(L0,_,_評価_着手_局面ならび_2),
member([_評価,_着手,_局面2],L0).
の最後memberが働いて、全解を取り出せると思います。
3手先読みの最善手は -> 次の可能な全ての手を評価して整列 ->
探索範囲を狭めるため枝切り -> 最も評価の高い手を選択 ->
相手の立場から最も評価高い手を選択 ->
その局面で全ての可能な着手を評価し -> 整列して枝切り ->
これで第一解が得られる
バックトラックすると、
3手先読みの整列枝切り後も member/2 の次の候補が取り出されて第二解。
findmax で次々呼び出されて、最高評価点を探す。
何か間違っていますね。 ! を削りましょう。そうすると、
着手候補の取り出し(_枝切り,_評価_着手_局面ならび_2,_評価,_着手,_局面2) :-
length(L0,_枝切り),
append(L0,_,_評価_着手_局面ならび_2),
member([_評価,_着手,_局面2],L0).
の最後memberが働いて、全解を取り出せると思います。
3手先読みの最善手は -> 次の可能な全ての手を評価して整列 ->
探索範囲を狭めるため枝切り -> 最も評価の高い手を選択 ->
相手の立場から最も評価高い手を選択 ->
その局面で全ての可能な着手を評価し -> 整列して枝切り ->
これで第一解が得られる
バックトラックすると、
3手先読みの整列枝切り後も member/2 の次の候補が取り出されて第二解。
findmax で次々呼び出されて、最高評価点を探す。
655デフォルトの名無しさん
2013/03/21(木) 00:55:51.96656デフォルトの名無しさん
2013/03/21(木) 01:29:24.35 その人、悪い人じゃないんだけど、ちょっとおかしいところあるから、あまり関わらないほうがいいよ。
657デフォルトの名無しさん
2013/03/21(木) 06:29:01.79 >>655
Wikipedia の幅優先の項のグラフを借用して説明します。
http://ja.wikipedia.org/wiki/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2
1
2 3 4
5 6 7 8
9 10 11 12
プログラムでは、着手評価が唯一の実効のある作用なので、着手評価によって
横方向の優先順位を決めることが幅優先に見えることは仕方ない。
[2,3,4],[5,6],[7,8],[11,12]の順序は実は動的に決められます。
しかし、実際の手の読む順序は
1 - 2 - 5 - 9 が第一解
1 - 2 - 5 - 10 が第二解
1 - 2 - 6 が第三解
のように、このノードが先に優先して評価されていきます。2-5-9,10を評価して
いる時には7,8,11,12などは置いてきぼりの状態にあります。
これは幅優先ではありません。
Wikipedia の幅優先の項のグラフを借用して説明します。
http://ja.wikipedia.org/wiki/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2
1
2 3 4
5 6 7 8
9 10 11 12
プログラムでは、着手評価が唯一の実効のある作用なので、着手評価によって
横方向の優先順位を決めることが幅優先に見えることは仕方ない。
[2,3,4],[5,6],[7,8],[11,12]の順序は実は動的に決められます。
しかし、実際の手の読む順序は
1 - 2 - 5 - 9 が第一解
1 - 2 - 5 - 10 が第二解
1 - 2 - 6 が第三解
のように、このノードが先に優先して評価されていきます。2-5-9,10を評価して
いる時には7,8,11,12などは置いてきぼりの状態にあります。
これは幅優先ではありません。
658657
2013/03/21(木) 06:31:38.99 実際の手の読まれる順序 ですね。
659デフォルトの名無しさん
2013/03/21(木) 10:44:06.29660デフォルトの名無しさん
2013/03/21(木) 21:35:47.92 大学で習ったから家でもやろうかと思い立ったが、やっぱり個人で無料の場合はswi-prologなのだろうか
ちなみに大学は有料の処理系つかってたみたい
ちなみに大学は有料の処理系つかってたみたい
661デフォルトの名無しさん
2013/03/21(木) 23:37:50.17 教官とそのソフトの業者がつるんでるんだろうな。
でなきゃ、Prologとして十分な機能を備えているswi-prologを避ける理由が分からん。
でなきゃ、Prologとして十分な機能を備えているswi-prologを避ける理由が分からん。
662デフォルトの名無しさん
2013/03/22(金) 07:06:47.14663デフォルトの名無しさん
2013/04/02(火) 13:57:47.80 macでgnu prologやってみたいのですが、「gprolog-1.4.3.tar.gz.」をダウンロードしてからが
分かりません、どなたか教えていただけませんか
分かりません、どなたか教えていただけませんか
664デフォルトの名無しさん
2013/04/02(火) 21:34:37.35 GNU is Need Unix
665デフォルトの名無しさん
2013/04/03(水) 01:00:09.38 >663
まさか解凍できないという話ではないでしょうね
まさか解凍できないという話ではないでしょうね
666デフォルトの名無しさん
2013/04/03(水) 01:09:29.27 xcodeとコマンドラインツールズとhomebrewもいれららない世の中じゃ、ポイズン。
667デフォルトの名無しさん
2013/04/03(水) 21:02:14.22 ははあ、LC475かな。FPUというのがあってですね。
668デフォルトの名無しさん
2013/04/03(水) 22:00:36.89 Macportもどうぞ
669デフォルトの名無しさん
2013/05/18(土) 18:33:05.23 【論理力テスト】次の文章は正しいようで実は論理的に間違っています。どこがどうおかしいか貴方は説明できますか→「何度学校を変わってもいじめられるのは、いじめられる側に原因がある証拠だ」…答えは「感情自己責任論」で検索
670デフォルトの名無しさん
2013/05/18(土) 21:27:03.74 >>669
検索したが分からなかった。
あなた説明して。
∀Student[∀School{bullied(Student,School)→caused(Student)}]
全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。
もしかして、反証可能な命題の提示ではあるが論理的な証明ではないとか言えば良い?
検索したが分からなかった。
あなた説明して。
∀Student[∀School{bullied(Student,School)→caused(Student)}]
全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。
もしかして、反証可能な命題の提示ではあるが論理的な証明ではないとか言えば良い?
671670
2013/05/18(土) 21:45:08.12 違うか。
> ∀Student[∀School{bullied(Student,School)→caused(Student)}]
> 全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。
∀Student[∀School{(enroll(Student,School)∧bullied(Student,School))→caused(Student)}]
全ての生徒について、その生徒が在学したあらゆる学校で虐められるならばその生徒に原因がある。
> ∀Student[∀School{bullied(Student,School)→caused(Student)}]
> 全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。
∀Student[∀School{(enroll(Student,School)∧bullied(Student,School))→caused(Student)}]
全ての生徒について、その生徒が在学したあらゆる学校で虐められるならばその生徒に原因がある。
672デフォルトの名無しさん
2013/05/19(日) 13:06:01.33 SWI-Prologって64bit版が出ていたのですね。
知らなかったが,Windows 7の64bit版に
今日インストールして使いはじめました。
気のせいか,処理速度がすこし速くなったよう
に思います。
知らなかったが,Windows 7の64bit版に
今日インストールして使いはじめました。
気のせいか,処理速度がすこし速くなったよう
に思います。
673デフォルトの名無しさん
2013/05/19(日) 20:15:05.45 Bratko さんの Prolog 本(新版)の日本語版はでないのでしょうか
…原書の自炊ミスって単語一個分余計に切り落してしまい絶望中
…原書の自炊ミスって単語一個分余計に切り落してしまい絶望中
674デフォルトの名無しさん
2013/05/20(月) 23:47:35.64 SWI-Prologの64bit版をインストールしたのだけれど
SWI-Prolog-Editorと相性が悪いらしく,
configurationのProlog folderに64bit版のフォルダーを
していして,プログラムを書いてconsult.を押しても,
prologプログラムが見当たらないというエラーメッセージ
がでる。
しかたがないので,32bit版もインストールしてそちら
のホルダーを指定して使っている。
64bit版でSWI-Prolog-Editorを同期して使っている方
が居られましたら,どうすべきかご教授いただけると
ありがたいです。
SWI-Prolog-Editorと相性が悪いらしく,
configurationのProlog folderに64bit版のフォルダーを
していして,プログラムを書いてconsult.を押しても,
prologプログラムが見当たらないというエラーメッセージ
がでる。
しかたがないので,32bit版もインストールしてそちら
のホルダーを指定して使っている。
64bit版でSWI-Prolog-Editorを同期して使っている方
が居られましたら,どうすべきかご教授いただけると
ありがたいです。
675デフォルトの名無しさん
2013/06/14(金) 12:50:56.41 prologで作られたアプリケーションやライブラリのリンク集みたいなものはないのでしょうか
prologで型推論エンジンつくろうと思ってるのですが
多分だれか既に作った人いないわけないので
どこかで公開していないかと
prologで型推論エンジンつくろうと思ってるのですが
多分だれか既に作った人いないわけないので
どこかで公開していないかと
676デフォルトの名無しさん
2013/06/15(土) 00:25:36.27 arXivで検索検索
677デフォルトの名無しさん
2013/06/17(月) 19:15:02.01678デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN 量子コンピュータが実用化されたら Prolog 大活躍するん?
679デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN >>678
むしろPrologが必要なくなる方向を予想する
むしろPrologが必要なくなる方向を予想する
680デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN681デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN >>680
というか、すべての計算を探索に還元するんだから、わざわざPrologで設計する必要がないというか
というか、すべての計算を探索に還元するんだから、わざわざPrologで設計する必要がないというか
682デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN683デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN 量子コンピュータが実現しても、KL/1でやってることががprologのコードで書けるようになるというイメージしかない
684デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN Prologがやるべきことは、人間にとって寧ろ需要な
表層の知を確認する作業。要するにシンボル操作だから、
量子コンピュータとは直接的な繋がりはないかも。
表層の知を確認する作業。要するにシンボル操作だから、
量子コンピュータとは直接的な繋がりはないかも。
685デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN SWI prologです
ex.pl というファイルを
?- X is 3,X > 0.
?- append([1,2,3],[4],X),print(X),write(X).
以上のような中身とし、
コンソールで [ex]. とうつと
902 ?- [ex].
aaa+[1,2,3,4]
% ex compiled 0.00 sec, 1 clauses
true.
のようになるんですが、これをコンソールで逐一手で入力したのと同様に、下記のように変数の同定結果まで出力させるにはどうしたらよいでしょうか?
903 ?- X is 3,X > 0.
X = 3.
904 ?- append([1,2,3],[4],X),print('aaa'+ X).
aaa+[1,2,3,4]
X = [1, 2, 3, 4].
ex.pl というファイルを
?- X is 3,X > 0.
?- append([1,2,3],[4],X),print(X),write(X).
以上のような中身とし、
コンソールで [ex]. とうつと
902 ?- [ex].
aaa+[1,2,3,4]
% ex compiled 0.00 sec, 1 clauses
true.
のようになるんですが、これをコンソールで逐一手で入力したのと同様に、下記のように変数の同定結果まで出力させるにはどうしたらよいでしょうか?
903 ?- X is 3,X > 0.
X = 3.
904 ?- append([1,2,3],[4],X),print('aaa'+ X).
aaa+[1,2,3,4]
X = [1, 2, 3, 4].
686デフォルトの名無しさん
2013/09/01(日) 19:13:48.36 swipl-win.exeで、日本語を入力したときにカーソル位置がズレるのですが、何か良い手はないでしょうか?
version 6.4.1 (windows 64bit)版です。
version 6.4.1 (windows 64bit)版です。
687デフォルトの名無しさん
2013/09/01(日) 20:41:43.53 emacsのシェルモードで試してみてはどうか
688デフォルトの名無しさん
2013/09/01(日) 21:52:09.09 windowsなので、emacsは入れたくないです。cygwinインストールが必須らしいので。
サクラエディタ上で使えたらよいのですが、うまくいきません。
サクラエディタ上で使えたらよいのですが、うまくいきません。
689デフォルトの名無しさん
2013/09/01(日) 21:56:08.08 >>688
emacsもmeadowもcygwin無しでOKのwindows版あるよ
emacsもmeadowもcygwin無しでOKのwindows版あるよ
690デフォルトの名無しさん
2013/09/01(日) 22:23:09.77 ありがとうございます。試しにMeadow入れてみました。
M-x shellでシェルモードにして、その中でswipl.exeを実行してみましたが、
プロンプトが表示されないなど、満足に動作しませんでした。
M-x shellでシェルモードにして、その中でswipl.exeを実行してみましたが、
プロンプトが表示されないなど、満足に動作しませんでした。
691デフォルトの名無しさん
2013/09/07(土) 16:18:13.90 日本語対応が十分にできるている処理系はありますか?
692デフォルトの名無しさん
2013/09/12(木) 18:45:07.45 Prologで仕様記述できますか?
693デフォルトの名無しさん
2013/09/12(木) 19:42:43.95 >>692
ルールを決めればできるでしょう。
ルールを決めればできるでしょう。
694デフォルトの名無しさん
2013/09/28(土) 12:48:49.81 Prologで2つの値が等しいと(ポインター)アドレスが等しいは区別されていますか?
Lispのeq? equal?の違いみたいなものです
Lispのeq? equal?の違いみたいなものです
695デフォルトの名無しさん
2013/09/28(土) 16:58:44.30696デフォルトの名無しさん
2013/09/30(月) 16:49:29.65 X =:= Y.
697デフォルトの名無しさん
2013/10/02(水) 13:46:42.08 >>692
そこで言ってる仕様記述ってどういう意味のですか?
そこで言ってる仕様記述ってどういう意味のですか?
698デフォルトの名無しさん
2013/10/20(日) 04:46:24.01 PrologにはstalinやMLtonみたいな
超高速コンパイラってありますか?
超高速コンパイラってありますか?
699デフォルトの名無しさん
2013/10/20(日) 17:54:10.52 ICOTでいろいろ量産されてた気がする
700デフォルトの名無しさん
2013/10/21(月) 09:21:25.23 いつのまにかEclipseでPrologが書けるようになってた
便利だ・・・
便利だ・・・
701デフォルトの名無しさん
2013/10/23(水) 10:06:56.32 Prologで常識的には
ある文章の中の名詞なり動詞なりなにを関数にするもんなでしょう?
ある文章の中の名詞なり動詞なりなにを関数にするもんなでしょう?
702デフォルトの名無しさん
2013/10/23(水) 11:23:06.63 >>701
対象となっている、物、事、性質、動作、行為、状態、これらの複合したもの、
文章。何がきてもよいのではないですか。述語論理だから、述語、すなわち、
動詞句や形容詞等が来なくてはならないということはありません。
対象となっている、物、事、性質、動作、行為、状態、これらの複合したもの、
文章。何がきてもよいのではないですか。述語論理だから、述語、すなわち、
動詞句や形容詞等が来なくてはならないということはありません。
703デフォルトの名無しさん
2013/10/23(水) 19:36:57.16704デフォルトの名無しさん
2013/10/24(木) 11:33:03.43705デフォルトの名無しさん
2013/10/27(日) 06:57:07.73 東京キャビネットみたいな
高速で検索できるデータベースの中を
Prologの命題で検索できないのでしょうか
MySQLは,それっぽいのみつけたので
既にあるのかもしれないですが
高速で検索できるデータベースの中を
Prologの命題で検索できないのでしょうか
MySQLは,それっぽいのみつけたので
既にあるのかもしれないですが
706デフォルトの名無しさん
2013/10/27(日) 09:25:23.92 Prologで文法のサイトはよく見るんだが
VSのプロジェクトのような作り方ってPrologできるのん?
VSのプロジェクトのような作り方ってPrologできるのん?
707デフォルトの名無しさん
2013/12/17(火) 10:57:32.78 swi-prologが標準みたいだけど
swi-prologが一番使われてる理由って何故ですか?
swi-prologじゃなくて2番手みたいな処理系ってないのですか?
swi-prologが一番使われてる理由って何故ですか?
swi-prologじゃなくて2番手みたいな処理系ってないのですか?
708デフォルトの名無しさん
2013/12/17(火) 11:59:17.93709デフォルトの名無しさん
2013/12/18(水) 12:46:39.18710デフォルトの名無しさん
2013/12/19(木) 08:47:57.77 PrologをSQLに変換するコンパイラなんてのをみつけた
Prologの構文って全部SQLに変換できるのだろうか
Prologの構文って全部SQLに変換できるのだろうか
711デフォルトの名無しさん
2013/12/20(金) 17:55:44.14 prologは演繹データベースだから、prolog -> SQL は難しい
SQL -> prolog なら大学の演習レベルでもなんとかなると思う
SQL -> prolog なら大学の演習レベルでもなんとかなると思う
712デフォルトの名無しさん
2013/12/20(金) 18:58:22.89 >>711
そうですね。単位節データベースの参照の後に延々とルールが来て、
それでデータベースのフィールド参照のキーが漸く来るなんてことも
有りえます。そういう場合は、selectを参照する条件としてそれらを
型推論的な先読みをしたとしても、拾ってくるのはかなり難しいです。
そうですね。単位節データベースの参照の後に延々とルールが来て、
それでデータベースのフィールド参照のキーが漸く来るなんてことも
有りえます。そういう場合は、selectを参照する条件としてそれらを
型推論的な先読みをしたとしても、拾ってくるのはかなり難しいです。
713デフォルトの名無しさん
2014/02/24(月) 00:48:00.61 RDFのデータベースを検索するSQLの親戚あるけど
あれならPrologと一対一で変換できそう
あれならPrologと一対一で変換できそう
714デフォルトの名無しさん
2014/03/09(日) 15:32:00.41 SWI-Prologを使っているんだけどユニファイ可能な節が1つ以上存在するかを判定する組み込み述語ってある?
今はfindallした結果のリストの長さが0以上かで判定してる…
今はfindallした結果のリストの長さが0以上かで判定してる…
715デフォルトの名無しさん
2014/03/09(日) 16:10:50.90716デフォルトの名無しさん
2014/03/09(日) 18:25:03.73 いい女ぴー?
やらしてくれるぴー?
やらしてくれるぴー?
717デフォルトの名無しさん
2014/03/16(日) 21:00:44.77ID:8VpQ5LoV >>714
ユーザ定義述語であることが条件だが、findall/3とclause/2を使うのが普通だと思う。
ユニファイ可能な節が1つ以上存在するかを判定する(Head) :- findall(_,clause(Head,Body),[_|_]).
ユーザ定義述語であることが条件だが、findall/3とclause/2を使うのが普通だと思う。
ユニファイ可能な節が1つ以上存在するかを判定する(Head) :- findall(_,clause(Head,Body),[_|_]).
718デフォルトの名無しさん
2014/04/09(水) 21:24:27.23ID:i/ZHdrIw >>717
findall/3を使わないと少なくとも幾つあるかはわからない。
findall/3を使わないと少なくとも幾つあるかはわからない。
719デフォルトの名無しさん
2014/06/05(木) 12:16:15.58ID:JLFuk7Df generate(C) :-
random_between(65, 90, I),
atom_char(C, I).
experiment('STAP', Count) :- !,
writef('%w回目で陽性かくにん!¥nよかった☆¥n', [Count]).
experiment(_, Count) :-
generate(S),
generate(T),
generate(A),
generate(P),
atomic_list_concat([S, T, A, P], CELL),
writef('%w細胞', [CELL]),
NextCount is Count + 1,
experiment(CELL, NextCount).
main :-
experiment([], 0).
もっと面白い書き方ないかな?
random_between(65, 90, I),
atom_char(C, I).
experiment('STAP', Count) :- !,
writef('%w回目で陽性かくにん!¥nよかった☆¥n', [Count]).
experiment(_, Count) :-
generate(S),
generate(T),
generate(A),
generate(P),
atomic_list_concat([S, T, A, P], CELL),
writef('%w細胞', [CELL]),
NextCount is Count + 1,
experiment(CELL, NextCount).
main :-
experiment([], 0).
もっと面白い書き方ないかな?
720デフォルトの名無しさん
2014/06/05(木) 19:08:53.35ID:h2Dia7Mk % 特に改善されたという訳ではない。
generate(CELL) :-
findall(A,(
between(1,4,_),
N is random(26),
sub_atom('ABCDEFGHIJKLMNOPQRSTUVWXYZ',N,1,_,A)),
L),
atomic_list_concat(L,CELL).
main :-
nth1(Count,_,_),
generate(CELL),
writef('%w細胞', [CELL]),
CELL = 'STAP',
writef('%w回目で陽性かくにん!\nよかった☆\n', [Count]).
generate(CELL) :-
findall(A,(
between(1,4,_),
N is random(26),
sub_atom('ABCDEFGHIJKLMNOPQRSTUVWXYZ',N,1,_,A)),
L),
atomic_list_concat(L,CELL).
main :-
nth1(Count,_,_),
generate(CELL),
writef('%w細胞', [CELL]),
CELL = 'STAP',
writef('%w回目で陽性かくにん!\nよかった☆\n', [Count]).
721デフォルトの名無しさん
2014/06/05(木) 19:35:36.06ID:h2Dia7Mk722デフォルトの名無しさん
2014/06/05(木) 23:17:35.42ID:awAmNJBx STAP細胞でコードゴルフでもするかね
723デフォルトの名無しさん
2014/06/06(金) 00:01:25.80ID:Ynv3Q/53 g(C):- findall(I,(between(0,3,_),random_between(65,90,I)),C).
e([83,84,65,80],N):-!, format('~w回目で陽性かくにん!¥nよかった☆¥n',[N]).
e(_, N):- g(C), format('~c~c~c~c細胞', C), N1 is N+1, e(C, N1).
main:-e([], 0).
$ wc stap.pl
3 16 233 stap.pl
$ swipl -q -t main -f stap.prolog
ドヤ!
e([83,84,65,80],N):-!, format('~w回目で陽性かくにん!¥nよかった☆¥n',[N]).
e(_, N):- g(C), format('~c~c~c~c細胞', C), N1 is N+1, e(C, N1).
main:-e([], 0).
$ wc stap.pl
3 16 233 stap.pl
$ swipl -q -t main -f stap.prolog
ドヤ!
724デフォルトの名無しさん
2014/06/06(金) 00:03:45.32ID:Ynv3Q/53 g(C):-findall(I,(between(0,3,_),random_between(65,90,I)),C).
e([83,84,65,80],N):-!,format('~w回目で陽性かくにん!¥nよかった☆¥n',[N]).
e(_,N):-g(C),format('~c~c~c~c細胞',C),N1 is N+1,e(C,N1).
main:-e([],0).
$ wc -c stap.pl
223 stap.pl
$ swipl -q -t main -f stap.pl
スペースつめるの忘れてた
e([83,84,65,80],N):-!,format('~w回目で陽性かくにん!¥nよかった☆¥n',[N]).
e(_,N):-g(C),format('~c~c~c~c細胞',C),N1 is N+1,e(C,N1).
main:-e([],0).
$ wc -c stap.pl
223 stap.pl
$ swipl -q -t main -f stap.pl
スペースつめるの忘れてた
725デフォルトの名無しさん
2014/06/06(金) 00:52:39.27ID:Ynv3Q/53 g(C):-findall(I,(between(0,3,_),random(65,91,I)),C).
e([83,84,65,80],N):-!,format('~w回目で陽性かくにん!¥nよかった☆¥n',N).
e(_,N):-g(C),format('~c~c~c~c細胞',C),O is N+1,e(C,O).
m:-e(0,0).
$ wc -c stap.pl
207 stap.pl
swipl -q -t m -f stap.pl
もうだめだ寝る
e([83,84,65,80],N):-!,format('~w回目で陽性かくにん!¥nよかった☆¥n',N).
e(_,N):-g(C),format('~c~c~c~c細胞',C),O is N+1,e(C,O).
m:-e(0,0).
$ wc -c stap.pl
207 stap.pl
swipl -q -t m -f stap.pl
もうだめだ寝る
726片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0
2014/06/30(月) 22:35:30.71ID:CGk8SAom 古典的な人工知能の研究をしています片山博文MZです。
最近Prologの重要性がわかるようになってきました。
PrologからC言語の関数を呼ぶ方法と、C言語からPrologを扱う方法を教えて下さい。
最近Prologの重要性がわかるようになってきました。
PrologからC言語の関数を呼ぶ方法と、C言語からPrologを扱う方法を教えて下さい。
727デフォルトの名無しさん
2014/07/01(火) 00:10:07.68ID:8cxNwtXU728片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0
2014/07/01(火) 00:12:40.61ID:/dpi9Kd/ ありがとうございます。
729デフォルトの名無しさん
2014/07/12(土) 22:10:17.18ID:x0cGe7WX swi-prologを使ってるんだけどassertした節を自動的にファイルに保存するようにはできないのかな
assertする度にlistingで書き出してバックアップとるのめんどくさそうだし効率わるそう
assertする度にlistingで書き出してバックアップとるのめんどくさそうだし効率わるそう
730デフォルトの名無しさん
2014/07/12(土) 22:56:26.14ID:ktHPdOby731デフォルトの名無しさん
2014/07/23(水) 04:59:03.99ID:W7WkvjfP prologでGAを実装するのには他の言語(Java)で実装するより何が優れている?
732デフォルトの名無しさん
2014/07/23(水) 18:41:02.31ID:Ricx3ybR カットを使った多様性の表現のし易さ
733デフォルトの名無しさん
2014/07/24(木) 01:48:04.69ID:Zh2B/axR GAにおいてとくにPrologが優れてる点は思いつかないけど、
Javaは冗長でほんと疲れる
Prologなら
member(1,L).
で済むところが、Java だと
List<Integer> list = new LinkedList<Integer>();
list.add(1);
になるからな。
GAだって銀行の勘定系だって、Prologなら半ページで書ける
Javaは冗長でほんと疲れる
Prologなら
member(1,L).
で済むところが、Java だと
List<Integer> list = new LinkedList<Integer>();
list.add(1);
になるからな。
GAだって銀行の勘定系だって、Prologなら半ページで書ける
734デフォルトの名無しさん
2014/07/24(木) 03:43:43.10ID:1HIq9M5v Prologこそ冗長の極みでそw
735デフォルトの名無しさん
2014/07/24(木) 09:11:30.92ID:URujTxoj736デフォルトの名無しさん
2014/08/17(日) 15:56:42.59ID:8ylmIV1H prolog覚えたいんですけど、何かいい方法はありますか?
Cやvba、php、あとcssなど触ってきましたが、やや特殊な感じがしてなかなか覚えることが出来ません…
習うより慣れろ、でしょうか
Cやvba、php、あとcssなど触ってきましたが、やや特殊な感じがしてなかなか覚えることが出来ません…
習うより慣れろ、でしょうか
737デフォルトの名無しさん
2014/08/17(日) 16:35:59.06ID:XkL8f3FM まずは手続き型プログラミングの延長で考えよう
たとえば値 x とy の最大値を求める関数 max(x, y) を疑似コードで書くと:
max(x, y) = if x > y then z := x else z := y; return z
これを Prolog では:
max(X, Y, Z) ;- X > Y, !, Z = X.
max(_, Y, Z) ;- Z = Y.
と書けるけど、一般にはより簡潔に以下のように書く:
max(X, Y, X) ;- X > Y, !.
max(_, Y, Y).
ここで、カット "!" は条件式と以降の文との間に置く "then" と見る
ここまでは(手続き型における)「分岐」のパターンになるけど、
手続き型の「反復」を Prolog では「再帰」で書くから、
「再帰の書き方(=再帰的定義)」に慣れることが最初の壁になる
たとえば数のリストについて、各値を +1 する述語 list_succ は:
list_succ([X|XS], [Y|YS]) ;- Y is X + 1, !, list_succ(XS, YS).
list_succ([], []).
と書き、同様に偶数だけを抽出する述語は:
list_even([X|XS], [X|YS]) ;- is_even(X), !, list_even(XS, YS).
list_even([_|XS], YS) ;- list_even(XS, YS).
list_even([], []).
こういった手続き型プログラミングと共通する概念とその書き方に慣れてから、
Ptolog 固有の「単一化」や「バックトラッキング」といった概念を学ぶといい
たとえば値 x とy の最大値を求める関数 max(x, y) を疑似コードで書くと:
max(x, y) = if x > y then z := x else z := y; return z
これを Prolog では:
max(X, Y, Z) ;- X > Y, !, Z = X.
max(_, Y, Z) ;- Z = Y.
と書けるけど、一般にはより簡潔に以下のように書く:
max(X, Y, X) ;- X > Y, !.
max(_, Y, Y).
ここで、カット "!" は条件式と以降の文との間に置く "then" と見る
ここまでは(手続き型における)「分岐」のパターンになるけど、
手続き型の「反復」を Prolog では「再帰」で書くから、
「再帰の書き方(=再帰的定義)」に慣れることが最初の壁になる
たとえば数のリストについて、各値を +1 する述語 list_succ は:
list_succ([X|XS], [Y|YS]) ;- Y is X + 1, !, list_succ(XS, YS).
list_succ([], []).
と書き、同様に偶数だけを抽出する述語は:
list_even([X|XS], [X|YS]) ;- is_even(X), !, list_even(XS, YS).
list_even([_|XS], YS) ;- list_even(XS, YS).
list_even([], []).
こういった手続き型プログラミングと共通する概念とその書き方に慣れてから、
Ptolog 固有の「単一化」や「バックトラッキング」といった概念を学ぶといい
738デフォルトの名無しさん
2014/08/17(日) 17:01:36.81ID:XkL8f3FM >>737 のコード中にある ;- は :- のタイプミスなので訂正
739デフォルトの名無しさん
2014/08/17(日) 20:16:33.99ID:3mYBlI6x 8/22(金)10:30〜
放送大学集中放送授業期間
『記号論理学('14)』
というのがある。
オススメというよりも自分が楽しみにしているのだけど。
放送大学集中放送授業期間
『記号論理学('14)』
というのがある。
オススメというよりも自分が楽しみにしているのだけど。
740デフォルトの名無しさん
2014/08/18(月) 20:04:08.48ID:5sINgTuF741デフォルトの名無しさん
2014/08/19(火) 00:32:49.89ID:hp9R9Csq 論理的な側面を忘れて、prologを手続型の言語として捉えるのはいい勉強になるね
少し趣旨は違うけど
main :- between(1, 9, X), between(1, 9, Y), Z is X * Y, write(X*Y=Z), nl, fail.
失敗駆動ループを覚えると、バックトラックが少し楽に理解できるかも
少し趣旨は違うけど
main :- between(1, 9, X), between(1, 9, Y), Z is X * Y, write(X*Y=Z), nl, fail.
失敗駆動ループを覚えると、バックトラックが少し楽に理解できるかも
742デフォルトの名無しさん
2014/08/19(火) 07:39:00.21ID:a3YaW1zc 冗長の極みを露悪的に表現したPrologコード。
今度は一万円に達するか、さらに買い物をしなくてはならないか、
レジと売り場を行ったり来たり、駆けずり回っている。
http://nojiriko.asia/prolog/p_odai4_776.html
今度は一万円に達するか、さらに買い物をしなくてはならないか、
レジと売り場を行ったり来たり、駆けずり回っている。
http://nojiriko.asia/prolog/p_odai4_776.html
743デフォルトの名無しさん
2014/08/19(火) 08:21:36.82ID:a3YaW1zc 少し違うのですが、これも手続き的なシミュレーション。
http://nojiriko.asia/prolog/fukakusa_no_shoushou_1_1_1.html
深草の少将は小野小町のもとに雨の日も風の日も
百夜通うのですが、百夜目に力尽き、はかなくなります。
一夜、通う度に、榻(牛車に乗り降りする為の渡し板)に
刻みを入れます。そして数えます。ひとつ、ふたつ、・・・
http://nojiriko.asia/prolog/fukakusa_no_shoushou_1_1_1.html
深草の少将は小野小町のもとに雨の日も風の日も
百夜通うのですが、百夜目に力尽き、はかなくなります。
一夜、通う度に、榻(牛車に乗り降りする為の渡し板)に
刻みを入れます。そして数えます。ひとつ、ふたつ、・・・
744デフォルトの名無しさん
2014/08/19(火) 23:25:35.45ID:AYs1stK5 >>741
九九の表を印刷するお題は、自分なら以下のように書く
main :- findall(X, multiply_of_product(X), Xs), print_list(Xs).
multiply_of_product(Z) :- between(1, 3, X), between(1, 3, Y), Z is X * Y.
print_list([X|Xs]) :- write(X), nl, print_list(Xs).
print_list([]).
失敗駆動ループ技法は、いわゆるバッド・ノウハウの類いだと思う
九九の表を印刷するお題は、自分なら以下のように書く
main :- findall(X, multiply_of_product(X), Xs), print_list(Xs).
multiply_of_product(Z) :- between(1, 3, X), between(1, 3, Y), Z is X * Y.
print_list([X|Xs]) :- write(X), nl, print_list(Xs).
print_list([]).
失敗駆動ループ技法は、いわゆるバッド・ノウハウの類いだと思う
745デフォルトの名無しさん
2014/08/20(水) 17:10:44.30ID:4GbBt7a2 >>744
失敗駆動をfindall/3で隠蔽していますね。同様に、
main :- forall(multiply_of_product(X),writef('%t\n',[X])).
というのもあります。
失敗駆動をfindall/3で隠蔽していますね。同様に、
main :- forall(multiply_of_product(X),writef('%t\n',[X])).
というのもあります。
746デフォルトの名無しさん
2014/08/20(水) 21:59:59.69ID:QfOrIRE5747デフォルトの名無しさん
2014/08/20(水) 23:19:48.10ID:32E1i6+B >>746
>これはあくまでバックトラックを理解するための例として
初心者に対してバックトラックの理解を助ける最初の例として、
失敗駆動ループは不適切という話だ
もっと単純で分かりやすい例を持ち出すべきだった
>ただし、どうしても失敗駆動が必要になることもあるからね
そのとおりだね
どうしても使わなければ解決できない問題に対してだけ使うべき
たとえば>>744 のコードだと、全解探索結果リスト Xs が
メモリに乗り切れないほど巨大という極限のケースでは
失敗駆動ループ技法も(>>745と合わせて)検討候補になるだろう
逆に言えば、一般的な多くのケースで Prolog らしい
エレガントな解法があるのに、ただ書き慣れているからという理由で
安易に失敗駆動ループ技法を使うのは中級プログラマとして失格だと思う
だから >>744 ではバッド・ノウハウの類いと書いた
>これはあくまでバックトラックを理解するための例として
初心者に対してバックトラックの理解を助ける最初の例として、
失敗駆動ループは不適切という話だ
もっと単純で分かりやすい例を持ち出すべきだった
>ただし、どうしても失敗駆動が必要になることもあるからね
そのとおりだね
どうしても使わなければ解決できない問題に対してだけ使うべき
たとえば>>744 のコードだと、全解探索結果リスト Xs が
メモリに乗り切れないほど巨大という極限のケースでは
失敗駆動ループ技法も(>>745と合わせて)検討候補になるだろう
逆に言えば、一般的な多くのケースで Prolog らしい
エレガントな解法があるのに、ただ書き慣れているからという理由で
安易に失敗駆動ループ技法を使うのは中級プログラマとして失格だと思う
だから >>744 ではバッド・ノウハウの類いと書いた
748デフォルトの名無しさん
2014/08/20(水) 23:58:46.17ID:32E1i6+B バックトラックの例について書く
たとえば(>>745 は気付いていると思うけど) >>744 はバックトラックの応用になる
?- multiply_of_product(X).
X = 1 ; % 最初の解が表示され、";" をタイプするとバックトラックで次の解を求める
X = 2 ;
X = 3 ;
X = 2. % 途中で止めたい時には [return] をタイプすると入力待ちに戻る
?-
この述語 multiply_of_product/1 に関して、組み込み述語 findall/3 を使って
すべての解のリストを求めたのが >>744 になる
またリストそのものもバックトラックの対象になる
?- append(Xs, Ys, [1,2,3]). % 述語 append/3 は2つのリストを結合したリストを求める
Xs = [],
Ys = [1, 2, 3] ;
Xs = [1],
Ys = [2, 3] ;
Xs = [1, 2],
Ys = [3] ;
Xs = [1, 2, 3],
Ys = [] ;
false. % すべての解を探索し終えると false を表示して入力待ちに戻る
?-
同様に findall/3 を使ってすべての解のリストを求めてみる
?- findall((X,Y), append(X,Y,[1,2,3]), ListOfPair).
ListOfPair = [ ([], [1, 2, 3]), ([1], [2, 3]), ([1, 2], [3]), ([1, 2, 3], [])].
?-
たとえば(>>745 は気付いていると思うけど) >>744 はバックトラックの応用になる
?- multiply_of_product(X).
X = 1 ; % 最初の解が表示され、";" をタイプするとバックトラックで次の解を求める
X = 2 ;
X = 3 ;
X = 2. % 途中で止めたい時には [return] をタイプすると入力待ちに戻る
?-
この述語 multiply_of_product/1 に関して、組み込み述語 findall/3 を使って
すべての解のリストを求めたのが >>744 になる
またリストそのものもバックトラックの対象になる
?- append(Xs, Ys, [1,2,3]). % 述語 append/3 は2つのリストを結合したリストを求める
Xs = [],
Ys = [1, 2, 3] ;
Xs = [1],
Ys = [2, 3] ;
Xs = [1, 2],
Ys = [3] ;
Xs = [1, 2, 3],
Ys = [] ;
false. % すべての解を探索し終えると false を表示して入力待ちに戻る
?-
同様に findall/3 を使ってすべての解のリストを求めてみる
?- findall((X,Y), append(X,Y,[1,2,3]), ListOfPair).
ListOfPair = [ ([], [1, 2, 3]), ([1], [2, 3]), ([1, 2], [3]), ([1, 2, 3], [])].
?-
749デフォルトの名無しさん
2014/08/21(木) 14:24:23.77ID:LiUTLLqd750デフォルトの名無しさん
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).
この制御のためのカットも他に手がない。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★2 [蚤の市★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 [蚤の市★]
- 【ド軍】山本由伸、WBC出場を決断!ドジャースが本人の意向を尊重、佐々木朗希はチームが故障歴を懸念で不参加 [鉄チーズ烏★]
- 米大統領報道官「日本と強固な同盟維持、中国とも協力」 [少考さん★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ ★2 [蚤の市★]
- 【テレビ】粗品「THE W」バッサリ「おもんない、レベル低い」審査員就任で「日テレが“血の海”に…」 [湛然★]
- 通気取り「⚪︎⚪︎を食べればその店の実力が分かる」←だから何だ?
- 女の子集合!
- ひまでんぼ
- おまえら宝くじは買わないと当たらないんだぞ?
- タバコ吸わんがこれでタバコ吸ってたらカッコ良いかも
- 「鈴木彩艷」←これ読めない奴wwwwwwwwwwwwwwwwwwwwwwwwwwwwww
