Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん
2010/11/06(土) 13:00:562010/11/06(土) 13:04:34
ただでさえ過疎スレなのに初心者スレが必要なのか?
2010/11/06(土) 13:26:20
>>1
萌
萌
4デフォルトの名無しさん
2010/11/06(土) 13:28:222010/11/06(土) 14:23:21
Prolog初心者があそびにきました
1. 日本語の通る無料の処理系
2, 初心者向けチュートリアル
3. 初心者向けおすすめ書籍(いまでも容易に手に入るもの)
あたりがテンプレにあると助かります
ご一考いただれば幸いです
1. 日本語の通る無料の処理系
2, 初心者向けチュートリアル
3. 初心者向けおすすめ書籍(いまでも容易に手に入るもの)
あたりがテンプレにあると助かります
ご一考いただれば幸いです
2010/11/06(土) 23:55:21
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
7デフォルトの名無しさん
2010/11/07(日) 19:12:20 .NETで動く、あるいはC#コードに埋め込めるPrologがあればいいのだが
2010/11/07(日) 22:39:54
Prolog#
IronProlog
IronProlog
2010/11/07(日) 23:08:05
>>8
おぉ、d
おぉ、d
2010/11/09(火) 09:56:40
2010/11/09(火) 10:01:41
1211
2010/11/09(火) 10:04:06 ごめん処理系だから、 1, でした。
2, は素っ気ないのが多くて難しいな。
2, は素っ気ないのが多くて難しいな。
2010/11/09(火) 10:34:19
2010/11/09(火) 12:17:58
考えてみると、Prologチュートリアルはこのスレ(別スレ立ててもいいけど)でこれから始めればよい。
2010/11/09(火) 14:53:12
「Prologの宿題片付けます」の方は、凝った問題が多くて初心者向けとは
いえないから、ここは思い切りやさしい課題満載のスレになるといいね。
いえないから、ここは思い切りやさしい課題満載のスレになるといいね。
16デフォルトの名無しさん
2010/11/09(火) 21:57:56 prologこそクラウドを制することの出来る言語
2010/11/09(火) 22:41:14
つーかPrologは何に向いてるのかが初心者を惑わすのだと思ふ
2010/11/10(水) 06:33:16
Prolog 百夜話
引数がリストかどうか判定する述語 list/1 の定義は、
list([_|_]).
です。
?- list([1,2,3]).
yes
?- list([1,2|R]).
R = _13353
yes
?- list([1,[a,b],3]).
yes
?- list(3).
no
ところで、
?- list([]).
no
?- 空リストはリストではありません。アトムです。
引数がリストかどうか判定する述語 list/1 の定義は、
list([_|_]).
です。
?- list([1,2,3]).
yes
?- list([1,2|R]).
R = _13353
yes
?- list([1,[a,b],3]).
yes
?- list(3).
no
ところで、
?- list([]).
no
?- 空リストはリストではありません。アトムです。
2010/11/10(水) 11:22:34
2010/11/10(水) 12:59:28
2010/11/10(水) 13:17:24
>>20
多分、定理証明のような分野を念頭に置いての書き込みだろう。
現在のPrologの衰退ぶりから見て、それが常識化しているのかも
知れない。
このスレの中でその常識が誤謬であることを証明しよう。
ありとあらゆる分野のコードを示すことで。
多分、定理証明のような分野を念頭に置いての書き込みだろう。
現在のPrologの衰退ぶりから見て、それが常識化しているのかも
知れない。
このスレの中でその常識が誤謬であることを証明しよう。
ありとあらゆる分野のコードを示すことで。
2010/11/10(水) 19:51:31
2010/11/10(水) 20:20:30
>>22
そうだったか!
私は20年以上、空リストはリストではないと思っていた。
list([]).
list([_|_]).
これが定義ですか。
アトムでかつリストというのはちょっと腑に落ちないが。
そうだったか!
私は20年以上、空リストはリストではないと思っていた。
list([]).
list([_|_]).
これが定義ですか。
アトムでかつリストというのはちょっと腑に落ちないが。
2010/11/10(水) 20:25:49
2010/11/10(水) 21:13:19
完全な定義は、
list(V) :- var(V),!,fail.
list([]).
list([H|T]) :- list(T).
'.'(3,5) はリストではない。
list(V) :- var(V),!,fail.
list([]).
list([H|T]) :- list(T).
'.'(3,5) はリストではない。
2010/11/10(水) 21:17:44
ぶっちゃけリストの定義なり扱いなりは、歴史的には処理系によりけりなりけり。
[]がアトムでなくてもあまり困らないし。
[]がアトムでなくてもあまり困らないし。
2010/11/10(水) 21:40:22
>>26
そういうことのようですね。
そういうことのようですね。
2010/11/11(木) 08:42:20
初心者にとっては難解なやりとりだったと思いますが、
list/1 という述語は integer/1 と同じく検査用の述語として使おうとしています。
?- list([1,2]).
yes
?- list(8).
no
?- です。典型的な使われ方としては、
加算([],0).
加算([L|R],S) :-
list(L),
加算(L,S1),
加算(R,S2),
S is S1 + S2.
加算([A|R],S) :-
number(A),
加算(R,S1),
S is A + S1.
?- 加算([3,4,[1,2,3],2],X).
X = 15
?- となります。
list/1 という述語は integer/1 と同じく検査用の述語として使おうとしています。
?- list([1,2]).
yes
?- list(8).
no
?- です。典型的な使われ方としては、
加算([],0).
加算([L|R],S) :-
list(L),
加算(L,S1),
加算(R,S2),
S is S1 + S2.
加算([A|R],S) :-
number(A),
加算(R,S1),
S is A + S1.
?- 加算([3,4,[1,2,3],2],X).
X = 15
?- となります。
2010/11/12(金) 05:55:38
2010/11/12(金) 09:07:46
アトムでも複合項でもない「文字列」の型を導入している処理系だってあるし、
別に何でもいいのでは
別に何でもいいのでは
2010/11/12(金) 09:10:45
もちろんISO準拠にはならないという意味では困るけど
2010/11/12(金) 09:20:29
>>29
横レスだけど、Prologの[]は、LISPでいうところのNILに相当するのではないかと
?- X=[a|[]].
X = [a].
?- X=[she | [is | [25 | []]]].
X = [she, is, 25].
横レスだけど、Prologの[]は、LISPでいうところのNILに相当するのではないかと
?- X=[a|[]].
X = [a].
?- X=[she | [is | [25 | []]]].
X = [she, is, 25].
2010/11/12(金) 09:24:51
そういえば、Schemeの空リスト () は型が独立している…よね?
2010/11/12(金) 09:34:34
>>30
単純項と複合項 しかない というのがPrologの値打ちだったのではないかな。
単純項と複合項 しかない というのがPrologの値打ちだったのではないかな。
2010/11/12(金) 09:40:55
よくわからんけど、その「単純項」とやらの仲間に入れてやればいいじゃん
数のことを考えてあえて「アトム」とは書かなかったんでしょ
数のことを考えてあえて「アトム」とは書かなかったんでしょ
2010/11/12(金) 09:46:47
2010/11/12(金) 09:50:20
また誰も使っていない用語をw
2010/11/12(金) 10:03:18
2010/11/12(金) 10:08:33
その場その場で言葉を類推して作ってるんですねw
2010/11/12(金) 10:32:37
>>39
うん。言葉の選択は大事だからいつもわかりやすい言い方が
ないか探してはいる。単項はアトムを言い換えたのだけれども、
ここは変数との対比になるから定数でなくてはいけない。
単純項という言葉は Prolog-KABA のリファレンスマニュアルが
初出かも知れない。後に出版された単行本にも出てくるはず。
Prolog講座などの単一化の授業以外では使われないと思う。
うん。言葉の選択は大事だからいつもわかりやすい言い方が
ないか探してはいる。単項はアトムを言い換えたのだけれども、
ここは変数との対比になるから定数でなくてはいけない。
単純項という言葉は Prolog-KABA のリファレンスマニュアルが
初出かも知れない。後に出版された単行本にも出てくるはず。
Prolog講座などの単一化の授業以外では使われないと思う。
2010/11/12(金) 10:58:23
プロログ講座実施規程
第一条 JIS用語は、これを無視する。
第一条 JIS用語は、これを無視する。
2010/11/12(金) 11:51:21
毎日がプロローグ。だからいつも新鮮
2010/11/12(金) 14:03:34
ここまでの内容をふまえて、初心者向けに
・PrologのISO規格は1995年以降。不統一な用語の亡霊が君に新鮮な毎日をもたらさんとす。
・「アトム」は整数などを含まない。(Common Lisp用語との違い)
・PrologのISO規格は1995年以降。不統一な用語の亡霊が君に新鮮な毎日をもたらさんとす。
・「アトム」は整数などを含まない。(Common Lisp用語との違い)
2010/11/12(金) 14:42:15
Prologの世界は用語には無頓着で20年くらい前の話になるけど
ISO規格の日本側委員だった中村克彦先生がunificationを
融合、融合とおっしゃるから、我が意を得たりで、「やはり、
融合で統一のお考えですか」と訊いたら、
「あ、全然そんなことないです。なんでもいいんです。」
だと。
ISO規格の日本側委員だった中村克彦先生がunificationを
融合、融合とおっしゃるから、我が意を得たりで、「やはり、
融合で統一のお考えですか」と訊いたら、
「あ、全然そんなことないです。なんでもいいんです。」
だと。
2010/11/12(金) 14:51:01
unificationを融合?w
resolutionと混同してませんか、それ
resolutionと混同してませんか、それ
2010/11/12(金) 14:57:53
>>45
いいえ、unificationですw
いいえ、unificationですw
2010/11/12(金) 15:03:00
「なんでもいい」というのは「統一されていれば、」というふうに解釈しますけどね私はw
2010/11/12(金) 15:22:11
>>47
まあ、そうでしょう。
まあ、そうでしょう。
2010/11/12(金) 15:48:57
unificationの訳語は「単一化」じゃないの?
2010/11/12(金) 15:54:50
>>49
悔やまれるのは、「先生ぜひ融合で統一しましょう」と尻を押さなかったこと。その場に
いたProlog協会の面々を扇動して、このように強く働きかければ、中島、後藤、古川氏等は
中村先生が説得可能だったでしょう。当時はメジャー言語の尻尾くらいにいたから、考えも
しなかったけど、今思えば、単一化なんて変な用語はまずかった。
単一化しかない言語ですから。
悔やまれるのは、「先生ぜひ融合で統一しましょう」と尻を押さなかったこと。その場に
いたProlog協会の面々を扇動して、このように強く働きかければ、中島、後藤、古川氏等は
中村先生が説得可能だったでしょう。当時はメジャー言語の尻尾くらいにいたから、考えも
しなかったけど、今思えば、単一化なんて変な用語はまずかった。
単一化しかない言語ですから。
2010/11/12(金) 16:05:20
2010/11/12(金) 16:07:37
やばい、なんか気持ちが入って混乱気味の発言になった。
2010/11/12(金) 17:07:37
ISOでいう「compound term」(複合項。これも論理学風)と同じ意味の「structure」の訳語としては、
「構造」より「構造体」の方がわかりやすいというか、正しいというか、そんな気がする。
少なくとも日本語では「構造物」を単に「構造」と言ったら分かりにくいんじゃないか、
というような意味で。今さらだけどw
「構造」より「構造体」の方がわかりやすいというか、正しいというか、そんな気がする。
少なくとも日本語では「構造物」を単に「構造」と言ったら分かりにくいんじゃないか、
というような意味で。今さらだけどw
2010/11/12(金) 21:42:03
用語ばなしの続きですが、これまで何度も使ってきた例の述語、
親子(頼朝,義朝).
親子(義朝,為義).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
でなぜ、親子にはルールがないか、という問題です。親子/2は英語で
いうところのprimitiveな情報ということになります。まあ、最後に
行き着くところ、ですね。このような情報を何と呼ぶか、25年くらい
悩んできたのですが、最近これを、基(もとい)と表現することにしま
した。ここで、親子/2はもといである、という風に使います。
「単一化」以上に日常から離れますが、やまと言葉に潜む力に賭けたい
と思います。
親子(頼朝,義朝).
親子(義朝,為義).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
でなぜ、親子にはルールがないか、という問題です。親子/2は英語で
いうところのprimitiveな情報ということになります。まあ、最後に
行き着くところ、ですね。このような情報を何と呼ぶか、25年くらい
悩んできたのですが、最近これを、基(もとい)と表現することにしま
した。ここで、親子/2はもといである、という風に使います。
「単一化」以上に日常から離れますが、やまと言葉に潜む力に賭けたい
と思います。
2010/11/12(金) 22:03:36
実は>>26を書いたとき、「[]を「(リストの)けり」と呼ぶことを今思いついた」と
よほど付け加えようと思いましたが、やめてよかったと思いますw
よほど付け加えようと思いましたが、やめてよかったと思いますw
2010/11/12(金) 23:30:26
親子/2は、単純に「命題」という用語でいいんじゃないのかな。
命題は西洋哲学から生まれた概念だから、やまと言葉には
そぐわないかもしれないけど。
ところで、数学だと和算という言葉はあるけど、論理学には対応する
やまと言葉はあるのかな?哲学は「問答(もんどう)」でいい気はするけど。
命題は西洋哲学から生まれた概念だから、やまと言葉には
そぐわないかもしれないけど。
ところで、数学だと和算という言葉はあるけど、論理学には対応する
やまと言葉はあるのかな?哲学は「問答(もんどう)」でいい気はするけど。
2010/11/13(土) 05:07:55
58デフォルトの名無しさん
2010/11/13(土) 23:36:00 prologは業務処理に向いているだろうか?
2010/11/14(日) 02:34:14
>>58
現在のPrologは32bit以上の整数を自動で扱えますから、障碍になる
部分はありません。ライブラリを作らないコミュニティなので、
基本的に自前の必要はあります。COBOLのDATA DIVISION を解析して、
Prologに変換的なことを最も得意とする言語です。ということは、
すべてのデジタル化可能な業務文書の解析を得意とするということで
あり、なぜこれまで業務処理に積極的に使われてこなかったのか、
不思議ですね.
現在のPrologは32bit以上の整数を自動で扱えますから、障碍になる
部分はありません。ライブラリを作らないコミュニティなので、
基本的に自前の必要はあります。COBOLのDATA DIVISION を解析して、
Prologに変換的なことを最も得意とする言語です。ということは、
すべてのデジタル化可能な業務文書の解析を得意とするということで
あり、なぜこれまで業務処理に積極的に使われてこなかったのか、
不思議ですね.
2010/11/14(日) 17:32:07
2010/11/15(月) 08:04:20
本格的な業務プログラムとなると、10万述語程度の定義が
必要になる。一人のPrologプログラマの一ヶ月に定義でき
る限界は、1500述語程度だから、六ヶ月でプロジェクトを
終えることを目標にすると、10人以上のPrologプログラマ
を確保しなくてはならなくなる。現時点ではこれはまったく
不可能。Prologの過去の例ではICOTでのESPの開発しかない。
必要になる。一人のPrologプログラマの一ヶ月に定義でき
る限界は、1500述語程度だから、六ヶ月でプロジェクトを
終えることを目標にすると、10人以上のPrologプログラマ
を確保しなくてはならなくなる。現時点ではこれはまったく
不可能。Prologの過去の例ではICOTでのESPの開発しかない。
2010/11/15(月) 08:05:25
ESP開発はもちろん業務処理ではない。
2010/11/15(月) 08:31:51
ようするに、企業側からいうと、
一流大学卒のPrologプログラマをそんな業務開発などに
回せるか。という論理になる。一方、ある時期からは
学生の方も、Prologプログラマとして就職なんかして、
大丈夫かということになったから、現時点ではProlog
プログラマを業務開発用に確保することは至難となって
いる。
一流大学卒のPrologプログラマをそんな業務開発などに
回せるか。という論理になる。一方、ある時期からは
学生の方も、Prologプログラマとして就職なんかして、
大丈夫かということになったから、現時点ではProlog
プログラマを業務開発用に確保することは至難となって
いる。
2010/11/15(月) 09:08:24
2010/11/15(月) 17:04:37
2010/11/15(月) 18:02:43
Prolog本スレに大規模な業務処理に使われなかった理由がありました。
Prologでまったり Part3
http://pc11.2ch.net/test/read.cgi/tech/1193354806/115
> 115 :デフォルトの名無しさん [↓] :2008/04/26(土) 18:08:59
> COBOLを代替できなったという点は、>>83にちょっと出てきているが、
> アトムの爆発ということだとおもう。Prologではアトムをヒープエリア
> 内に一旦記述して処理する戦略をとる。極めて大きな記号間の連鎖を表現しよう
> とする記号処理言語ではどこかに対象となる情報すなわちアトムを保持せざるを
> えない。この場合、初出のアトムに対し必ずメモリ内を検索し、無い事を確認して
> 新たに構造体を追加する。業務処理で一日一億のトランザクションを処理する
> ケースだとこの参照時間だけで相当のものだ。やはり破壊代入だけで済ませる
> 言語には太刀打ちできない。さらに再帰で処理した場合はオーバーフローの危険が
> あるし、バックトラックして再束縛する場合でも、ヒープエリアのGCは必ず
> 必要になる。実際、保険業務などをPrologで処理することを想定すると、すぐに
> 電話帳一冊分くらいの量のアトムが発生してしまう。
> 企業業務はほとんどが記号処理、シンボル処理であり、Prologはそういう意味では
> 極めて適した言語なのだが、残念ながら以上のような理由から、大規模な業務処理
> には向いていない。
Prologでまったり Part3
http://pc11.2ch.net/test/read.cgi/tech/1193354806/115
> 115 :デフォルトの名無しさん [↓] :2008/04/26(土) 18:08:59
> COBOLを代替できなったという点は、>>83にちょっと出てきているが、
> アトムの爆発ということだとおもう。Prologではアトムをヒープエリア
> 内に一旦記述して処理する戦略をとる。極めて大きな記号間の連鎖を表現しよう
> とする記号処理言語ではどこかに対象となる情報すなわちアトムを保持せざるを
> えない。この場合、初出のアトムに対し必ずメモリ内を検索し、無い事を確認して
> 新たに構造体を追加する。業務処理で一日一億のトランザクションを処理する
> ケースだとこの参照時間だけで相当のものだ。やはり破壊代入だけで済ませる
> 言語には太刀打ちできない。さらに再帰で処理した場合はオーバーフローの危険が
> あるし、バックトラックして再束縛する場合でも、ヒープエリアのGCは必ず
> 必要になる。実際、保険業務などをPrologで処理することを想定すると、すぐに
> 電話帳一冊分くらいの量のアトムが発生してしまう。
> 企業業務はほとんどが記号処理、シンボル処理であり、Prologはそういう意味では
> 極めて適した言語なのだが、残念ながら以上のような理由から、大規模な業務処理
> には向いていない。
6765
2010/11/15(月) 18:53:47 >>66
はい。そうだと思いますw
実はこれは私の書き込みです。私はPrologの適性領域と限界という
ことをずっと考え続けてきたので、この書き込みの内容もまた真
ではないかとぶつけました。これからのPrologは20GBを超えるメモリ
での実行が当たり前のことになるでしょうし、オンメモリデータベース
としても最速クラスに近いメモリ管理・データ管理が要求されること
になるでしょう。
はい。そうだと思いますw
実はこれは私の書き込みです。私はPrologの適性領域と限界という
ことをずっと考え続けてきたので、この書き込みの内容もまた真
ではないかとぶつけました。これからのPrologは20GBを超えるメモリ
での実行が当たり前のことになるでしょうし、オンメモリデータベース
としても最速クラスに近いメモリ管理・データ管理が要求されること
になるでしょう。
2010/11/16(火) 09:42:35
話は逸れますが、過去の業務処理を調べると、古いシステムほど、
入力検査を厳しくやっています。入力がカードや紙テープですと、
どんなとんでもないエラーが入り込むかも知れないからと、一項目
一項目、いろんな角度から検査し、どこかにエラーが見つかれば、
入力の対象とはしない。そういう設計にしました。その後POSの
ような部分的に入力検査済みの装置を経るのが当たり前になり、
さらに、RDBの登場あたりからともかく入力させてしまって、削除、
修正はSQLでやればよい、と大分おおらかになったようです。
何でこの話をするかというと、COBOLだと100行以上の連続したIF文
など珍しくなかったのですが、これをPrologに移植すると100節では
なくて、100述語以上に変換されるかも知れないということがある
からです。
これこれこういう場合は(_検査対象,_診断) :- ...
がPrologの標準スタイルであり、あっという間に10万述語なんて
いってしまう理由がこんなところにもあります。
入力検査を厳しくやっています。入力がカードや紙テープですと、
どんなとんでもないエラーが入り込むかも知れないからと、一項目
一項目、いろんな角度から検査し、どこかにエラーが見つかれば、
入力の対象とはしない。そういう設計にしました。その後POSの
ような部分的に入力検査済みの装置を経るのが当たり前になり、
さらに、RDBの登場あたりからともかく入力させてしまって、削除、
修正はSQLでやればよい、と大分おおらかになったようです。
何でこの話をするかというと、COBOLだと100行以上の連続したIF文
など珍しくなかったのですが、これをPrologに移植すると100節では
なくて、100述語以上に変換されるかも知れないということがある
からです。
これこれこういう場合は(_検査対象,_診断) :- ...
がPrologの標準スタイルであり、あっという間に10万述語なんて
いってしまう理由がこんなところにもあります。
2010/11/16(火) 19:47:05
結局、現在のPrologの最大の問題は
100万節以上のデータベースを持つ場合、一節づつassertz
で追加する時に、各項のアトムの既出検査で、平均すると
アトム総数の半分のリンクを辿ります。いくらCPUのサイクル
が高まってもこれでは時間がかかり過ぎということです。
100万節以上のデータベースを持つ場合、一節づつassertz
で追加する時に、各項のアトムの既出検査で、平均すると
アトム総数の半分のリンクを辿ります。いくらCPUのサイクル
が高まってもこれでは時間がかかり過ぎということです。
70デフォルトの名無しさん
2010/11/16(火) 21:54:51 Prolog の入力述語について、
項の入力にはread/1が使われてきましたが、これは、
・ ピリオドで終わらなくてはならない。
・ シンタックス的に正しい項以外はエラーとなってしまう。
など、実務での使用に適しません。それで改行までの文字列を
入力として受け取る、get_line/1の定義をしておくのが普通です。
get_lineはget_char/1 または get_code/1を改行がくるまで、
繰り返し使うことによって定義します。例えば、
get_line(Line) :-
get_char(Char),
get_line_2(Char,L),
concat_atom(L,Line).
get_line_2('\n',[]) :- !.
get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R).
concat_atom([],'').
concat_atom([A|R],S) :- concat_atom(R,S1),atom_concat(A,S1,S).
項の入力にはread/1が使われてきましたが、これは、
・ ピリオドで終わらなくてはならない。
・ シンタックス的に正しい項以外はエラーとなってしまう。
など、実務での使用に適しません。それで改行までの文字列を
入力として受け取る、get_line/1の定義をしておくのが普通です。
get_lineはget_char/1 または get_code/1を改行がくるまで、
繰り返し使うことによって定義します。例えば、
get_line(Line) :-
get_char(Char),
get_line_2(Char,L),
concat_atom(L,Line).
get_line_2('\n',[]) :- !.
get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R).
concat_atom([],'').
concat_atom([A|R],S) :- concat_atom(R,S1),atom_concat(A,S1,S).
2010/11/16(火) 21:59:07
ちょっと読みにくかったですね。すみません。
<Prolog の入力述語について>
項の入力にはread/1が使われてきましたが、これは、
・ ピリオドで終わらなくてはならない。
・ シンタックス的に正しい項以外はエラーとなってしまう。
など、実務での使用に適しません。それで改行までの文字列を
入力として受け取る、get_line/1の定義をしておくのが普通です。
get_lineはget_char/1 または get_code/1を改行がくるまで、
繰り返し使うことによって定義します。例えば、
get_line(Line) :-
get_char(Char),
get_line_2(Char,L),
concat_atom(L,Line).
get_line_2('\n',[]) :- !.
get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R).
get_line_2は引数が違いますから、get_lineでもいいのですが、
ちょっと理由があってこうしました。これについては後に。
<Prolog の入力述語について>
項の入力にはread/1が使われてきましたが、これは、
・ ピリオドで終わらなくてはならない。
・ シンタックス的に正しい項以外はエラーとなってしまう。
など、実務での使用に適しません。それで改行までの文字列を
入力として受け取る、get_line/1の定義をしておくのが普通です。
get_lineはget_char/1 または get_code/1を改行がくるまで、
繰り返し使うことによって定義します。例えば、
get_line(Line) :-
get_char(Char),
get_line_2(Char,L),
concat_atom(L,Line).
get_line_2('\n',[]) :- !.
get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R).
get_line_2は引数が違いますから、get_lineでもいいのですが、
ちょっと理由があってこうしました。これについては後に。
2010/11/16(火) 22:09:40
ストリーム付きのget_line すなわち get_line/2
>>71 でget_line/2を使わなかったのは、この述語定義のために
残して置きたいという理由からでした。
get_line(Stream,Line) :-
get_char(Stream,Char),
get_line_3(Stream,Char,L),
concat_atom(L,Line).
get_line_3(Stream,'\n',[])..
get_line_3(Stream,A,[A|R]) :- get_char(Stream,B),get_line_3(Stream,B,R).
という定義であり、
?- open(File,read,Instram),get_line(Instream,Line),close(Instream), ... の
ように使います。
>>71 でget_line/2を使わなかったのは、この述語定義のために
残して置きたいという理由からでした。
get_line(Stream,Line) :-
get_char(Stream,Char),
get_line_3(Stream,Char,L),
concat_atom(L,Line).
get_line_3(Stream,'\n',[])..
get_line_3(Stream,A,[A|R]) :- get_char(Stream,B),get_line_3(Stream,B,R).
という定義であり、
?- open(File,read,Instram),get_line(Instream,Line),close(Instream), ... の
ように使います。
2010/11/16(火) 22:17:45
タブで終了させたい場合もあるでしょう。
get_line(Line) :-
get_char(Char),
get_line_2(Char,L),
concat_atom(L,Line).
get_line_2('\t',[]) :- !.
get_line_2('\n',[]) :- !.
get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R).
のように終止節を追加します。OSによっては、入力に
newline の他にキャレッジリターンフィールが入力される
ことがあり、これは無視するために、
get_line_2('\t',[]) :- !.
get_line_2('\n',[]) :- !.
get_line_2('\r',R) :- get_char(B),get_line_2(B,R),!.
get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R).
のように一節挿入します。
get_line(Line) :-
get_char(Char),
get_line_2(Char,L),
concat_atom(L,Line).
get_line_2('\t',[]) :- !.
get_line_2('\n',[]) :- !.
get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R).
のように終止節を追加します。OSによっては、入力に
newline の他にキャレッジリターンフィールが入力される
ことがあり、これは無視するために、
get_line_2('\t',[]) :- !.
get_line_2('\n',[]) :- !.
get_line_2('\r',R) :- get_char(B),get_line_2(B,R),!.
get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R).
のように一節挿入します。
2010/11/16(火) 22:44:02
業務用途ではないけどミドルウエアでは使われているよ。
あと、なぜ殆どの人はprologを言語上の述語理論でしか考えてない/られないのかね。
まるで判ってないと思う。
あと、なぜ殆どの人はprologを言語上の述語理論でしか考えてない/られないのかね。
まるで判ってないと思う。
2010/11/17(水) 06:15:18
2010/11/17(水) 07:31:46
入力はなしの続きです。
Prologでは引数で値を渡す定義が普通で、標準入力からデータ受け取って、
その後の処理をするプログラムはあまりありません。しかし、C/C++の宿題は
ほとんどすべてこの形式で出題されていて、このようなスタイルのPrologに
ついて整理する機会を得ました。それで、次からは入力検査についての話を
します。
Prologでは引数で値を渡す定義が普通で、標準入力からデータ受け取って、
その後の処理をするプログラムはあまりありません。しかし、C/C++の宿題は
ほとんどすべてこの形式で出題されていて、このようなスタイルのPrologに
ついて整理する機会を得ました。それで、次からは入力検査についての話を
します。
2010/11/17(水) 08:07:05
2010/11/17(水) 08:08:36
CGIでなくダイレクトにアプリが応答できるのはもちろん便利だけど。
2010/11/17(水) 09:57:09
最近は、原則として以下のような入力検査を必ずすることにしている。
例として、入力データが整数であることを要求されているとする。
整数データの入力(N) :-
write('整数を入力してください : '),
get_line(Line),
整数データの入力診断(Line,N),!.
整数データの入力(N) :- 整数データの入力(N).
整数データの入力診断(Line,N) :-
atom_to_term(Line,N,_),
integer(N),!.
整数データの入力診断(Line,N) :-
write_formatted('入力された %t からは整数が得られませんでした。再入力をお願いします\n',[Line
]),
fail.
ポイントは、
・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。
・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
例として、入力データが整数であることを要求されているとする。
整数データの入力(N) :-
write('整数を入力してください : '),
get_line(Line),
整数データの入力診断(Line,N),!.
整数データの入力(N) :- 整数データの入力(N).
整数データの入力診断(Line,N) :-
atom_to_term(Line,N,_),
integer(N),!.
整数データの入力診断(Line,N) :-
write_formatted('入力された %t からは整数が得られませんでした。再入力をお願いします\n',[Line
]),
fail.
ポイントは、
・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。
・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
2010/11/17(水) 09:58:03
最近は、原則として以下のような入力検査を必ずすることにしている。
例として、入力データが整数であることを要求されているとする。
整数データの入力(N) :-
write('整数を入力してください : '),
get_line(Line),
整数データの入力診断(Line,N),!.
整数データの入力(N) :- 整数データの入力(N).
整数データの入力診断(Line,N) :-
atom_to_term(Line,N,_),
integer(N),!.
整数データの入力診断(Line,N) :-
write_formatted('入力された %t からは整数が得られませんでした。再入力をお願いします\
n',[Line]),
fail.
ポイントは、
・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。
・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
例として、入力データが整数であることを要求されているとする。
整数データの入力(N) :-
write('整数を入力してください : '),
get_line(Line),
整数データの入力診断(Line,N),!.
整数データの入力(N) :- 整数データの入力(N).
整数データの入力診断(Line,N) :-
atom_to_term(Line,N,_),
integer(N),!.
整数データの入力診断(Line,N) :-
write_formatted('入力された %t からは整数が得られませんでした。再入力をお願いします\
n',[Line]),
fail.
ポイントは、
・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。
・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
2010/11/17(水) 09:59:48
入力のトップレベルと診断してしまうと、そこでfailになった場合、
get_line/1でせっかく入力された文字列とLineの束縛がそこで解かれて
しまって、
整数データの入力(N) :- 整数データの入力(N).
の引数を増やしてみても、Lineを受け取ることはできません。このため、
診断結果の表示はLineを渡された述語の中で行います。
atom_to_term は parse_atom という処理系もあり、文字列からPrologで
認識できる項を切り出す述語です。第三引数については後に説明します。
get_line/1でせっかく入力された文字列とLineの束縛がそこで解かれて
しまって、
整数データの入力(N) :- 整数データの入力(N).
の引数を増やしてみても、Lineを受け取ることはできません。このため、
診断結果の表示はLineを渡された述語の中で行います。
atom_to_term は parse_atom という処理系もあり、文字列からPrologで
認識できる項を切り出す述語です。第三引数については後に説明します。
2010/11/17(水) 10:04:42
表現が適切でない部分があったため、重複しますが、書き直しました。
ポイントは、
・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。
・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
入力のトップレベルで診断してしまうと、failになった場合get_line/1で
せっかく入力された文字列とLineの束縛がそこで解かれてしまって、
整数データの入力(N) :- 整数データの入力(N).
の引数を増やしてみても、Lineを受け取ることはできません。このため、
診断結果の表示はLineを渡された述語 整数データの入力診断/2の中で
行います。
atom_to_term は parse_atom という処理系もあり、文字列からPrologで
認識できる項を切り出す述語です。第三引数については後に説明します。
ポイントは、
・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。
・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
入力のトップレベルで診断してしまうと、failになった場合get_line/1で
せっかく入力された文字列とLineの束縛がそこで解かれてしまって、
整数データの入力(N) :- 整数データの入力(N).
の引数を増やしてみても、Lineを受け取ることはできません。このため、
診断結果の表示はLineを渡された述語 整数データの入力診断/2の中で
行います。
atom_to_term は parse_atom という処理系もあり、文字列からPrologで
認識できる項を切り出す述語です。第三引数については後に説明します。
83デフォルトの名無しさん
2010/11/20(土) 16:36:40 ちょっとしたシナリオの検証をするのに役に立つなー
2010/11/22(月) 19:04:17
>>58
この問題を蒸し返しますが、今日、私が要求されている
業務処理の大半が、Webからの情報の安定した抜き取りで
あり、そこで得られた情報の組み合わせを、保存する
ことです。いわゆる、計算はほとんどありません。
このような業務処理への適性では Prolog はスーパーの
クラスの中にいることは間違いありません。
この問題を蒸し返しますが、今日、私が要求されている
業務処理の大半が、Webからの情報の安定した抜き取りで
あり、そこで得られた情報の組み合わせを、保存する
ことです。いわゆる、計算はほとんどありません。
このような業務処理への適性では Prolog はスーパーの
クラスの中にいることは間違いありません。
2010/11/22(月) 19:12:52
昨日から Prolog を始めた初心者です。まるきり興味本位でやっています。
環境は Java6+PrologCafe1.2.5 です。
宿題スレにあった設問を自分なりに解いてみました。
http://www.dotup.org/uploda/www.dotup.org1263511.txt.html
パターンの数え上げ手法はあるソースを参考にしました。
あんまりあちこち見てて、どこだったかは分からなくなってしまいました。
その他いろいろ資料をあさってやってみたのですが、
switch文だの3項演算だのが頭にちらついて、どうも汚い感じにしか組めません。
とてもじゃないけどこれを「宿題だ持って行け」とは言えない・・・
メモリ足らずで JVM様が例外はいたりするので、
計算回数減らすための処理もこちょこちょ書いてるんですが、
たぶんすごく回りくどいことしてるんだと思います。
! もよく分からないので避けちゃってます。
もし簡単に改善できるところがあれば教えていただけると幸いです。
環境は Java6+PrologCafe1.2.5 です。
宿題スレにあった設問を自分なりに解いてみました。
http://www.dotup.org/uploda/www.dotup.org1263511.txt.html
パターンの数え上げ手法はあるソースを参考にしました。
あんまりあちこち見てて、どこだったかは分からなくなってしまいました。
その他いろいろ資料をあさってやってみたのですが、
switch文だの3項演算だのが頭にちらついて、どうも汚い感じにしか組めません。
とてもじゃないけどこれを「宿題だ持って行け」とは言えない・・・
メモリ足らずで JVM様が例外はいたりするので、
計算回数減らすための処理もこちょこちょ書いてるんですが、
たぶんすごく回りくどいことしてるんだと思います。
! もよく分からないので避けちゃってます。
もし簡単に改善できるところがあれば教えていただけると幸いです。
2010/11/23(火) 06:22:55
>>58
わが社の業務処理時の手動でのPrologインタプリタの負節入力(?- から始まる質問)の
累積数は18年間に70万を超えています。ほとんどが売上伝票入力ではありますが、
不自然さは全くありません。トランザクションとしては、別にPOS経由のものがあり、
こちらの累積は21年間で3000万くらいになります。Prologとの相性という点では、
従業員30-60名くらいの小企業だからこそと言うことができるかもしれない。よくぞ
小企業でいてくれた!,が正直な感想ですね。
わが社の業務処理時の手動でのPrologインタプリタの負節入力(?- から始まる質問)の
累積数は18年間に70万を超えています。ほとんどが売上伝票入力ではありますが、
不自然さは全くありません。トランザクションとしては、別にPOS経由のものがあり、
こちらの累積は21年間で3000万くらいになります。Prologとの相性という点では、
従業員30-60名くらいの小企業だからこそと言うことができるかもしれない。よくぞ
小企業でいてくれた!,が正直な感想ですね。
2010/11/23(火) 06:50:46
>>85
恐縮ですが、書き込まれた解答を、
http://nojiriko.asia/prolog/prolog_177_1.html に勝手に転記させていただきました。
uploadサイトの掲載時間に制限があるためであり、著作権については可能な処置を
したつもりです。
恐縮ですが、書き込まれた解答を、
http://nojiriko.asia/prolog/prolog_177_1.html に勝手に転記させていただきました。
uploadサイトの掲載時間に制限があるためであり、著作権については可能な処置を
したつもりです。
2010/11/23(火) 07:04:41
>>85
ストレートフラッシュを除くフラッシュが一回目の配札で出現する確率は
_確率 is 4 * (13/52) * (12/51) * (11/50) * (10/49) * (9/48).
ですよね。仮に、全知全能というよりも予言者的なプレーヤーがつぎに
配られる5枚のカードを分かってしまって、フラッシュになるに相応しい
手札の取り替え戦略をとったとすると、確率はどうなるんですか?
ストレートフラッシュを除くフラッシュが一回目の配札で出現する確率は
_確率 is 4 * (13/52) * (12/51) * (11/50) * (10/49) * (9/48).
ですよね。仮に、全知全能というよりも予言者的なプレーヤーがつぎに
配られる5枚のカードを分かってしまって、フラッシュになるに相応しい
手札の取り替え戦略をとったとすると、確率はどうなるんですか?
8988
2010/11/23(火) 07:06:00 ごめん、ストレートフラッシュを含んだでした。
2010/11/23(火) 11:11:43
4枚同じマークが配られて、一枚交換して、フラッシュになる確率は、
_確率 is 4 * ((13/52) * (12/51) * (11/50) * (10/49) + (1/47)).
でいいのかな?
_確率 is 4 * ((13/52) * (12/51) * (11/50) * (10/49) + (1/47)).
でいいのかな?
9190
2010/11/23(火) 11:14:46 あ、大間違いw
これから、夕方まで出かけるから、
その後で直します
これから、夕方まで出かけるから、
その後で直します
2010/11/23(火) 11:31:43
_確率 is 4 * ((13/52) * (12/51) * (11/50) * (10/49) * (39/48) * (9/47)).
となるのかな? これを2-5枚とやっていって、合計がフラッシュの確立かな。
本当かね。
となるのかな? これを2-5枚とやっていって、合計がフラッシュの確立かな。
本当かね。
2010/11/29(月) 22:45:09
論理プログラミングに最近強い関心があるので質問
1.学ぶ際にPrologを選んでも大丈夫?(念の為)
2.Wikipediaに目を通した感じではAZ-PrologやSWI-Prologが良さそうだけど、お勧めの処理系は?
1.学ぶ際にPrologを選んでも大丈夫?(念の為)
2.Wikipediaに目を通した感じではAZ-PrologやSWI-Prologが良さそうだけど、お勧めの処理系は?
2010/11/30(火) 05:10:29
1..それ以外の選択はむずかしいのではないかな。
2.. 日本語マニュアルが必要なら、AZ=Prolog。この処理系は1980年代に一世を風靡した
Prolog-KABAの後継を目指して開発されたもので、オンラインマニュアルの他、
Prolog-KABAの解説本も参考書になります。
今後、多くの仲間とライブラリを分け合ったりしながら発展していくには、
SWI-Prologがお勧めです。2000年代に入って最も活性のある処理系だと思います。
以前はバージョンによっていろいろ問題がありましたが現在は日本語も制限なく使えます。
おまけ.. Prologに慣れたら、Progol(誤植ではない)という処理系をインストールて
機能論理Prologで遊んでみるといいと思います。すでに定義された節から、
どうやったら新しいルールをProgolに生成させることができるか。大変興味い
テーマを楽しめます。
2.. 日本語マニュアルが必要なら、AZ=Prolog。この処理系は1980年代に一世を風靡した
Prolog-KABAの後継を目指して開発されたもので、オンラインマニュアルの他、
Prolog-KABAの解説本も参考書になります。
今後、多くの仲間とライブラリを分け合ったりしながら発展していくには、
SWI-Prologがお勧めです。2000年代に入って最も活性のある処理系だと思います。
以前はバージョンによっていろいろ問題がありましたが現在は日本語も制限なく使えます。
おまけ.. Prologに慣れたら、Progol(誤植ではない)という処理系をインストールて
機能論理Prologで遊んでみるといいと思います。すでに定義された節から、
どうやったら新しいルールをProgolに生成させることができるか。大変興味い
テーマを楽しめます。
9695
2010/11/30(火) 05:12:33 機能論理Prolog は 機能論理プログラミングの間違いでした。
9795
2010/11/30(火) 05:13:53 それから AZ=Prolog -> AZ-Prolog
2010/11/30(火) 06:33:50
>>95
もしProgolに手を出すなら
帰納論理プログラミングの入門書もどうぞ。
帰納論理プログラミング
http://furukawa.sfc.keio.ac.jp/book/
http://www.amazon.co.jp/dp/4320120140/
もしProgolに手を出すなら
帰納論理プログラミングの入門書もどうぞ。
帰納論理プログラミング
http://furukawa.sfc.keio.ac.jp/book/
http://www.amazon.co.jp/dp/4320120140/
2010/11/30(火) 07:23:30
大変! ^ wwww
機能論理プログラミングになっている。
帰納論理プログラミングの間違いです。
機能論理プログラミングになっている。
帰納論理プログラミングの間違いです。
100デフォルトの名無しさん
2010/11/30(火) 08:27:40 >>95-99
レスありがとう
処理系は俺の場合は既存の資産もないし、英語マニュアルに抵抗もないからSWI-Prologにする
帰納論理プログラミングも面白そう
ちょっと違うかもしれないが論理プログラミングにおけるメタプログラミングみたいな感じ?
レスありがとう
処理系は俺の場合は既存の資産もないし、英語マニュアルに抵抗もないからSWI-Prologにする
帰納論理プログラミングも面白そう
ちょっと違うかもしれないが論理プログラミングにおけるメタプログラミングみたいな感じ?
101デフォルトの名無しさん
2010/11/30(火) 08:40:23 >>100
関数型のメタプログラミングはあまり詳しくないから、そうだとも違うともいえませんが、
帰納論理プログラミングは(集合の)外延定義にヒントを与えてやると内包定義つまりルールを
生成してくるというような感じです。もちろん、外延だけでなく、内包も考慮しますから、
かなり複雑なルールの生成も可能なようです。しかし、一種のリバースエンジニアリング的な
ものですから、生成されるルールの可能性が大きく成りすぎて、収拾がつかない。というのが
私のレベルですね。
関数型のメタプログラミングはあまり詳しくないから、そうだとも違うともいえませんが、
帰納論理プログラミングは(集合の)外延定義にヒントを与えてやると内包定義つまりルールを
生成してくるというような感じです。もちろん、外延だけでなく、内包も考慮しますから、
かなり複雑なルールの生成も可能なようです。しかし、一種のリバースエンジニアリング的な
ものですから、生成されるルールの可能性が大きく成りすぎて、収拾がつかない。というのが
私のレベルですね。
102101
2010/11/30(火) 08:48:01 リバースエンジニアリング的という表現は適切でなかったので撤回します。
どういう表現が適切であるかは、もう少し考えます
どういう表現が適切であるかは、もう少し考えます
103デフォルトの名無しさん
2010/11/30(火) 12:56:16 メタプログラミングは「ロジックを生成するロジック」または「プログラムを生成するプログラム」
帰納的にルールを導出するというのがメタプログラミング的だと思ったけど
よく考えたら帰納も演繹もそうありうるような気がしてきた……
帰納的にルールを導出するというのがメタプログラミング的だと思ったけど
よく考えたら帰納も演繹もそうありうるような気がしてきた……
104デフォルトの名無しさん
2010/12/07(火) 03:33:25 むつかしい
105デフォルトの名無しさん
2010/12/07(火) 09:05:15106デフォルトの名無しさん
2010/12/07(火) 10:52:10 隠されたは言い過ぎだな。
せいぜい、隠れたロジック。
せいぜい、隠れたロジック。
107デフォルトの名無しさん
2010/12/07(火) 11:20:40 定義節集合から新たに論理式(述語定義)を発見するのが
帰納論理プログラミングであり、一方、我々の日常的な
プログラミングの目標は、課題(仕様)の自然言語表現から、
論理式(述語定義)を発見して、Prologプログラムとして
書くこと。
仮に、コンピュータを自然言語で操作することを目標と
した場合には、Prologの次善の言語としての地位は現在
も揺らいではいない。
帰納論理プログラミングであり、一方、我々の日常的な
プログラミングの目標は、課題(仕様)の自然言語表現から、
論理式(述語定義)を発見して、Prologプログラムとして
書くこと。
仮に、コンピュータを自然言語で操作することを目標と
した場合には、Prologの次善の言語としての地位は現在
も揺らいではいない。
108デフォルトの名無しさん
2010/12/23(木) 15:02:41 あげなさい
109デフォルトの名無しさん
2011/01/01(土) 18:44:51 swi-Prologを使用しています。
listingでプログラムをセーブするとき、tell(出力先)を使うしかないのでしょうか?
listingでプログラムをセーブするとき、tell(出力先)を使うしかないのでしょうか?
110デフォルトの名無しさん
2011/01/01(土) 19:38:50 >>109
open/3,listing/2,close/1などが使えないものか、
ということですね。私はtell/1でしか使ったことが
ながったので、確かめてみました。
結論からいうと、ストリームの使用はできないようですね。
open/3,listing/2,close/1などが使えないものか、
ということですね。私はtell/1でしか使ったことが
ながったので、確かめてみました。
結論からいうと、ストリームの使用はできないようですね。
111デフォルトの名無しさん
2011/01/01(土) 23:19:30 迷路で全ての経路探索とか出来るのん?
112デフォルトの名無しさん
2011/01/02(日) 01:17:51 方程式を自動で解くことはできるのん?
113デフォルトの名無しさん
2011/01/02(日) 06:59:51 >>111
Prologでまったりスレでも何回となく示された述語先祖で考えてみます。
親子(為義,義朝).
親子(義朝,頼朝).
の関係が定義されている時、先祖関係は、
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
で定義できます。
これは 為義 --- 義朝 --- 頼朝 の関係ですが、
これを 為義 --- 義朝 --- 義平
|- 為朝 |- 頼朝 --- 範頼
と定義し直します。
親子(為義,義朝).
親子(為義,為朝).
親子(義朝,義平).
親子(義朝,頼朝).
親子(頼朝,範頼). ですね。先祖関係の定義もちょっとだけ手を入れて、
先祖(A,B) :- 親子(A,B),write_formatted('%t-%t\n',[A,B]),!.
先祖(A,B) :- 親子(A,C),write_formatted('%t-%t\n',[A,C]),先祖(C,B). ここで、
?- 先祖(為義,範頼). を実行してみます。
為義-義朝
義朝-義平
義朝-頼朝
頼朝-範頼
yes で終了となります。あとで続きを書きます。
Prologでまったりスレでも何回となく示された述語先祖で考えてみます。
親子(為義,義朝).
親子(義朝,頼朝).
の関係が定義されている時、先祖関係は、
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
で定義できます。
これは 為義 --- 義朝 --- 頼朝 の関係ですが、
これを 為義 --- 義朝 --- 義平
|- 為朝 |- 頼朝 --- 範頼
と定義し直します。
親子(為義,義朝).
親子(為義,為朝).
親子(義朝,義平).
親子(義朝,頼朝).
親子(頼朝,範頼). ですね。先祖関係の定義もちょっとだけ手を入れて、
先祖(A,B) :- 親子(A,B),write_formatted('%t-%t\n',[A,B]),!.
先祖(A,B) :- 親子(A,C),write_formatted('%t-%t\n',[A,C]),先祖(C,B). ここで、
?- 先祖(為義,範頼). を実行してみます。
為義-義朝
義朝-義平
義朝-頼朝
頼朝-範頼
yes で終了となります。あとで続きを書きます。
114デフォルトの名無しさん
2011/01/02(日) 07:04:12 系図が歪んでしまいました。書き直し。
これは 為義 --- 義朝 --- 頼朝 の関係ですが、
これを 為義 --- 義朝 --- 義平
|- 為朝 |- 頼朝 --- 範頼
これは 為義 --- 義朝 --- 頼朝 の関係ですが、
これを 為義 --- 義朝 --- 義平
|- 為朝 |- 頼朝 --- 範頼
115デフォルトの名無しさん
2011/01/02(日) 07:15:36 >>113
で示した親子関係が迷路の回路選択を抽象したものになっていると思います。
分岐点(例えば為義)から開路である義朝に進むか、為朝に進むかの選択があります。
Prologは深さ優先選択という戦術で、次に義朝-義平の順で進んで行きます。
義平には子はいないようなので、諦めて、義朝分岐点に戻り、頼朝を選択する。
こうして、範頼にたどり着きます。
で示した親子関係が迷路の回路選択を抽象したものになっていると思います。
分岐点(例えば為義)から開路である義朝に進むか、為朝に進むかの選択があります。
Prologは深さ優先選択という戦術で、次に義朝-義平の順で進んで行きます。
義平には子はいないようなので、諦めて、義朝分岐点に戻り、頼朝を選択する。
こうして、範頼にたどり着きます。
116デフォルトの名無しさん
2011/01/02(日) 07:18:02 最後に強調されるべきことは、この経路選択
プログラムが
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
という極めて簡素な定義によって書き切られていると
いう点です。
プログラムが
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
という極めて簡素な定義によって書き切られていると
いう点です。
117デフォルトの名無しさん
2011/01/02(日) 14:24:42 AZ-Prologの64bit版は、6Gbyte以上のメモリーを推奨していますが、SW-Prologの64bit版は、どうなんでしょうか?
4Gbyteだと、問題があるでしょうか?
4Gbyteだと、問題があるでしょうか?
118デフォルトの名無しさん
2011/01/02(日) 14:44:59 >>117
SWI-Prologの64bit版は使ったことがないので、
これは回答ではありません。
AZ-Prologの64bit版についてですが、これは新しい
版がマルチコア対応の並列処理機能を目玉にして
いるため、必ずこの機能が使われるに相違ないとして、
保険をかけた感じで、大きなメモリーを推奨しているに
過ぎないと思います。小さいと動かなくなる理由はない
はずです。
SWI-Prologの64bit版は使ったことがないので、
これは回答ではありません。
AZ-Prologの64bit版についてですが、これは新しい
版がマルチコア対応の並列処理機能を目玉にして
いるため、必ずこの機能が使われるに相違ないとして、
保険をかけた感じで、大きなメモリーを推奨しているに
過ぎないと思います。小さいと動かなくなる理由はない
はずです。
119デフォルトの名無しさん
2011/01/02(日) 14:57:01 >>112
これに答えるのは私の能力を超えるので簡単に。
現在のPrologの仕様で引数の評価に大きな力を持た
せることは、ユニフィケーションが邪魔をして無理です。
さらに、現在のPrologの基本的に持っている能力は
変数の変域が離散的でごく限られた数である場合に、
虱潰しに変数に候補要素をあてはめて、確かめること
だけだと思います。変数制約を解消していくどんな機構も
持っていません。これを解決するには、この目的のために、
開発された、制約論理型プログラム言語を利用する他ない
のではないでしょうか。
多くの制約論理型言語はそのサブセットとして、Prologを
持っていますから、そういう利用が多いユーザは最初から
制約論理型言語を選択するべきでしょう。
これに答えるのは私の能力を超えるので簡単に。
現在のPrologの仕様で引数の評価に大きな力を持た
せることは、ユニフィケーションが邪魔をして無理です。
さらに、現在のPrologの基本的に持っている能力は
変数の変域が離散的でごく限られた数である場合に、
虱潰しに変数に候補要素をあてはめて、確かめること
だけだと思います。変数制約を解消していくどんな機構も
持っていません。これを解決するには、この目的のために、
開発された、制約論理型プログラム言語を利用する他ない
のではないでしょうか。
多くの制約論理型言語はそのサブセットとして、Prologを
持っていますから、そういう利用が多いユーザは最初から
制約論理型言語を選択するべきでしょう。
120デフォルトの名無しさん
2011/01/02(日) 23:44:13 おお説明来てる
が、むずい
勉強しよう
が、むずい
勉強しよう
121デフォルトの名無しさん
2011/01/03(月) 02:58:48 >>119
詳しい解説があったのでリンクします。
制約論理プログラミング
http://ja.wikipedia.org/wiki/%E5%88%B6%E7%B4%84%E8%AB%96%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
制約プログラミングのページ
http://www.constraint.org/constraint_org.htm
詳しい解説があったのでリンクします。
制約論理プログラミング
http://ja.wikipedia.org/wiki/%E5%88%B6%E7%B4%84%E8%AB%96%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
制約プログラミングのページ
http://www.constraint.org/constraint_org.htm
122デフォルトの名無しさん
2011/01/07(金) 09:21:23 Prologの入門本の学習順序の提案
杉崎昭生著「Prologを学ぶ」(http://www.amazon.co.jp/dp/4303716901/)
->
古川康一著「Prolog入門」(http://www.amazon.co.jp/dp/4274073084/)
杉崎昭生著「Prologを学ぶ」(http://www.amazon.co.jp/dp/4303716901/)
->
古川康一著「Prolog入門」(http://www.amazon.co.jp/dp/4274073084/)
123デフォルトの名無しさん
2011/01/08(土) 00:35:13 素人ですが、事例を検索するプログラムを考えています。
例えですが、文字列と、それを含むページについて考えます。
記号aを、この文字列として表すときは"a"とし、変数とするときはそのまま裸のaで表すことにします。
あいまいな表現になりますが、「aを含むページである」というのをPg(a)と表すと、
「Pg(a) ならば Pg(b)」 というのは、「aを含むページなら、bを含むページである」ということになります。
この式の値として、式を変形し、「¬(Pg(a)) または Pg(b)」 とし、aを含まないページの集合とbを含むページの集合の和集合を求め、そのページ数を全ページ数で割った値とします。この式の否定の値は、1との差の値になります。
式の値をこのようにするのは数学的に妥当なものなのでしょうか?
例えですが、文字列と、それを含むページについて考えます。
記号aを、この文字列として表すときは"a"とし、変数とするときはそのまま裸のaで表すことにします。
あいまいな表現になりますが、「aを含むページである」というのをPg(a)と表すと、
「Pg(a) ならば Pg(b)」 というのは、「aを含むページなら、bを含むページである」ということになります。
この式の値として、式を変形し、「¬(Pg(a)) または Pg(b)」 とし、aを含まないページの集合とbを含むページの集合の和集合を求め、そのページ数を全ページ数で割った値とします。この式の否定の値は、1との差の値になります。
式の値をこのようにするのは数学的に妥当なものなのでしょうか?
124デフォルトの名無しさん
2011/01/08(土) 05:15:34 >>123
「全ページのうち、命題を否定しないページと否定するページの割合」を計算しています。
数学的に妥当でない操作は行われていません。
でもaを含まないページは事例検索の利用者にとって無関係な事例でしょう。
必要なのは「aを含むページのうち、bを含むページと含まないページの割合」なのでは?
「全ページのうち、命題を否定しないページと否定するページの割合」を計算しています。
数学的に妥当でない操作は行われていません。
でもaを含まないページは事例検索の利用者にとって無関係な事例でしょう。
必要なのは「aを含むページのうち、bを含むページと含まないページの割合」なのでは?
125デフォルトの名無しさん
2011/01/08(土) 08:34:44 >>123
Pg(a) を太宰治が現れるページ Pg(b) を文学という語が
現れるページとすると、
「この式の値として、式を変形し、「\+(Pg(a)) または Pg(b)」
とし、aを含まないページの集合とbを含むページの集合の
和集合を求め、そのページ数を全ページ数で割った値」とは
(全ページ数 + 太宰治という語が現れないが文学という語の現れるページ数) / 全ページ数
ですね。この比率 - 1 は
( Pg(a),\+(Pg(b))のページ数 / 全ページ数 ではなくて
( \+Pg(a),pg(b))のページ数 / 全ページ数 なのではないか。
Pg(a) を太宰治が現れるページ Pg(b) を文学という語が
現れるページとすると、
「この式の値として、式を変形し、「\+(Pg(a)) または Pg(b)」
とし、aを含まないページの集合とbを含むページの集合の
和集合を求め、そのページ数を全ページ数で割った値」とは
(全ページ数 + 太宰治という語が現れないが文学という語の現れるページ数) / 全ページ数
ですね。この比率 - 1 は
( Pg(a),\+(Pg(b))のページ数 / 全ページ数 ではなくて
( \+Pg(a),pg(b))のページ数 / 全ページ数 なのではないか。
126124
2011/01/08(土) 10:00:12 >>125
A=太宰治がなく文学がないページ
B=太宰治があり文学がないページ
C=太宰治がなく文学があるページ
D=太宰治があり文学があるページ
とおくと、
全ページ = A+B+C+D
¬(Pg(a)) = A+C
Pg(b) = C+D
¬(Pg(a)) または Pg(b) = A+C+D
になります。
「aを含まないページの集合とbを含むページの集合の
和集合を求め、そのページ数を全ページ数で割った値」は
(A+C+D) / (A+B+C+D) です。
全ページのうち、「太宰治を含むなら文学を含む」を否定しないページの割合です。
これは1以下になります。この割合-1は無意味です。
1-この割合は B / (A+B+C+D) です。
全ページのうち、「太宰治を含むなら文学を含む」を否定するページの割合です。
>>123
事例検索の利用者にとっては太宰治を含まないページはどうでもいいから
役に立つのは「太宰治を含むページのうち、文学をを含むページの割合」と
「太宰治を含むページのうち、文学を含まないページの割合」ではないでしょうか。
A=太宰治がなく文学がないページ
B=太宰治があり文学がないページ
C=太宰治がなく文学があるページ
D=太宰治があり文学があるページ
とおくと、
全ページ = A+B+C+D
¬(Pg(a)) = A+C
Pg(b) = C+D
¬(Pg(a)) または Pg(b) = A+C+D
になります。
「aを含まないページの集合とbを含むページの集合の
和集合を求め、そのページ数を全ページ数で割った値」は
(A+C+D) / (A+B+C+D) です。
全ページのうち、「太宰治を含むなら文学を含む」を否定しないページの割合です。
これは1以下になります。この割合-1は無意味です。
1-この割合は B / (A+B+C+D) です。
全ページのうち、「太宰治を含むなら文学を含む」を否定するページの割合です。
>>123
事例検索の利用者にとっては太宰治を含まないページはどうでもいいから
役に立つのは「太宰治を含むページのうち、文学をを含むページの割合」と
「太宰治を含むページのうち、文学を含まないページの割合」ではないでしょうか。
127125
2011/01/08(土) 10:12:56 確かにそうですね。ありがとう。
128デフォルトの名無しさん
2011/01/08(土) 10:14:57129デフォルトの名無しさん
2011/01/08(土) 10:53:31 「Prologの宿題片付けます」スレで出ている、Prologの
解説本の中に8クィーンアルゴリズムは何種類くらい
あるかな、という話は現在まとめ中です。あまり、この
言語向きの課題とは思えないけど。
この言語向きの課題といえば、20年くらい前にProlog
を買っていた時、本屋の立ち読みの評価基準に使って
いたのが、経路問題の多寡。もちろん多いほど読み応え
がある。この基準でどんな本を復活できるかやってみま
しょう。
解説本の中に8クィーンアルゴリズムは何種類くらい
あるかな、という話は現在まとめ中です。あまり、この
言語向きの課題とは思えないけど。
この言語向きの課題といえば、20年くらい前にProlog
を買っていた時、本屋の立ち読みの評価基準に使って
いたのが、経路問題の多寡。もちろん多いほど読み応え
がある。この基準でどんな本を復活できるかやってみま
しょう。
130デフォルトの名無しさん
2011/01/08(土) 11:08:44 どんな本を復活できるか、とは妙な言い回しですが、
もう五年以上前になりますが、本棚に眠っていた、
「Prologを学ぶ --文化とその実践--」という本を
読んでみて、気に入ったというよりよく書けているのに
感心した。Amazonで確認してみるとほとんど売れ行き
は最下位近くに低迷していた。そこで、読み直したら
赤面ものの内容のないカスタマーレビューを書き、
星五つの評価を付けた。驚くべきことに、それ以降、
この無名本は常時Prolog本の売れ行き上位に入り続け
今日でも絶版にもならず、Amazonでは売り切れては
入荷をくり返している。こんなことで、忘れ去られた本
たちが復活できるなら、いくらでも労は惜しみません。
もう五年以上前になりますが、本棚に眠っていた、
「Prologを学ぶ --文化とその実践--」という本を
読んでみて、気に入ったというよりよく書けているのに
感心した。Amazonで確認してみるとほとんど売れ行き
は最下位近くに低迷していた。そこで、読み直したら
赤面ものの内容のないカスタマーレビューを書き、
星五つの評価を付けた。驚くべきことに、それ以降、
この無名本は常時Prolog本の売れ行き上位に入り続け
今日でも絶版にもならず、Amazonでは売り切れては
入荷をくり返している。こんなことで、忘れ去られた本
たちが復活できるなら、いくらでも労は惜しみません。
131123
2011/01/08(土) 12:30:04 経験の事例を単純に選言標準形で表したプログラムを考えていますが、
その世界での論理値を0から1までの値にして数学的な破綻がないかどうかが気になっていました。
意味のある検索とか、推論とかも、比の論理値で色々考えてみるつもりです。
その世界での論理値を0から1までの値にして数学的な破綻がないかどうかが気になっていました。
意味のある検索とか、推論とかも、比の論理値で色々考えてみるつもりです。
132デフォルトの名無しさん
2011/01/08(土) 13:02:44 ファジィ論理?
134デフォルトの名無しさん
2011/01/09(日) 08:49:36 手続きを書くのではなくて、
ぷろろぐに手続きを任せるって認識でいいのだろうかー
PGは関係を定義しておくだけという
で、がらがらと処理して真か偽かと
ぷろろぐに手続きを任せるって認識でいいのだろうかー
PGは関係を定義しておくだけという
で、がらがらと処理して真か偽かと
135デフォルトの名無しさん
2011/01/09(日) 10:45:34 2ch ヘッドラインニュースBBY(一覧性が秀逸)http://headline.2ch.net/bbynews/
どんな難解ニュースでも掲示板の書き込みでオモシロおかしく簡単理解。
ニュースを勢い順にカテゴリー別で表示する"2NN"(2ちゃんねるニュース速報+ナビゲーター)もどうぞ。
どんな難解ニュースでも掲示板の書き込みでオモシロおかしく簡単理解。
ニュースを勢い順にカテゴリー別で表示する"2NN"(2ちゃんねるニュース速報+ナビゲーター)もどうぞ。
136デフォルトの名無しさん
2011/01/11(火) 18:07:30 >>134
Prologはプログラムには確実に実行順序があります。
この実行順序を"意識"すると手続きになり、意識しない限りは
宣言的である(宣言的に読んでいる)といえます。
Prologの副目標(subgoalともいう)は真偽値しか返しません。これが
Prologプログラミングの核心であって、プログラマは、実際には、
全部真であるに違いないという姿勢でこの本体の記述を読みます。
つまり真偽値さへも意識しないのです。そして引数の変数の遷移を
一瞥します。
Prologを読むときにすることはこれだけです。そう、これだけです。
返り値のこともあるいはそのデータ型やクラスについて思いめぐら
すことは全く、ありません。
Prologはプログラムには確実に実行順序があります。
この実行順序を"意識"すると手続きになり、意識しない限りは
宣言的である(宣言的に読んでいる)といえます。
Prologの副目標(subgoalともいう)は真偽値しか返しません。これが
Prologプログラミングの核心であって、プログラマは、実際には、
全部真であるに違いないという姿勢でこの本体の記述を読みます。
つまり真偽値さへも意識しないのです。そして引数の変数の遷移を
一瞥します。
Prologを読むときにすることはこれだけです。そう、これだけです。
返り値のこともあるいはそのデータ型やクラスについて思いめぐら
すことは全く、ありません。
137デフォルトの名無しさん
2011/01/12(水) 23:53:14 ふm
肝はデータベースと見た
肝はデータベースと見た
138デフォルトの名無しさん
2011/01/13(木) 05:25:54139デフォルトの名無しさん
2011/01/14(金) 12:45:05 別解を求めていくためにカットを使わないところがあると、別解を求めていくとき、
節を選択する条件を兼ねた命題が失敗して次の節が選ばれればいいのですが、失敗でないのに次の節に移るときがあります。
そのために、条件の否定を加える必要があるのですが、
一般的に、カットを使わないときは、カットによって省略できていた命題を加えればいいということなのでしょうか?
節を選択する条件を兼ねた命題が失敗して次の節が選ばれればいいのですが、失敗でないのに次の節に移るときがあります。
そのために、条件の否定を加える必要があるのですが、
一般的に、カットを使わないときは、カットによって省略できていた命題を加えればいいということなのでしょうか?
140デフォルトの名無しさん
2011/01/14(金) 16:24:02 >>139
必要なことは、a,bが条件だとすると、
p(X) :- a,b,X=1.
p(X) :- a,\+(b),X=2.
p(X) :- \+(a),b,X=3.
p(X) :- \+(a),\+(b),X=4.
のような定義を「気楽」にできること。
実際には、a,b,の中に副作用があったりして
このような記述が不可能の場合もありますが。
我慢して、このような冗長なコードを書いて
いると、ご利益として、ブール代数的直感が
鋭くなってきていつの間にか以前よりも正確
なコード書くことができるようになります。
必要なことは、a,bが条件だとすると、
p(X) :- a,b,X=1.
p(X) :- a,\+(b),X=2.
p(X) :- \+(a),b,X=3.
p(X) :- \+(a),\+(b),X=4.
のような定義を「気楽」にできること。
実際には、a,b,の中に副作用があったりして
このような記述が不可能の場合もありますが。
我慢して、このような冗長なコードを書いて
いると、ご利益として、ブール代数的直感が
鋭くなってきていつの間にか以前よりも正確
なコード書くことができるようになります。
141デフォルトの名無しさん
2011/01/15(土) 22:48:50 問題 3つの整数があります。AとBとCの和が160,Aの2倍とBの3倍とCの和が297,Bの2倍とCの和が149で
す。Bはいくつですか。
'Bはいくつですか'(N) :-
length(D,160),
append(A,B,C,D),
length(E,297),
append(A,A,A2),
append(B,B,B,B3),
append(A2,B3,C,E),
length(F,149),
append(B,B,C,F),
length(B,N).
?- 'Bはいくつですか'(N).
N = 42
の解がでるまでにIF/Prologインタプリタで
6分30秒かかった。
す。Bはいくつですか。
'Bはいくつですか'(N) :-
length(D,160),
append(A,B,C,D),
length(E,297),
append(A,A,A2),
append(B,B,B,B3),
append(A2,B3,C,E),
length(F,149),
append(B,B,C,F),
length(B,N).
?- 'Bはいくつですか'(N).
N = 42
の解がでるまでにIF/Prologインタプリタで
6分30秒かかった。
142141
2011/01/19(水) 08:31:21 間違い。2.2GhzCPU Ubuntu10.10で242秒でした。
143デフォルトの名無しさん
2011/01/21(金) 13:07:46 ['X']というアトムのリストを、[X]という変数のリストにするにはどうすればいいのでしょうか?
144143
2011/01/21(金) 14:59:50 一応、外部にリストの形の文字列を出力してから、入力しています。
145デフォルトの名無しさん
2011/01/24(月) 06:45:38 >>143
どういう局面で変数ラベルがプログラマの期待通り
表示されるのかという問題と考えよう。
処理系によって異なるとおもうけれど、Heap領域に
元々の変数のラベルと現在の変数の一意名(大きの
場合番号)の対応表が確保される。この対応表が
Prologの処理系によって参照されるのは、
・listingなど定義節の表示(これは否応なくHeap
領域の参照が生じる。そのついで)
・インタプリタのトップレベルのインタプリタ側が
サービスとして表示する変数名。
であって、
?- atom_to_term('X',A,Varlist),write(A),nl.
を実行しても、
このトップレベルには変数Xが存在しないため、
_G24689
A = _G24689
yes としか表示されない。
つまり、トップレベルに現れる変数は例外として、
反駁途中stack領域内でのユニフィケーションに
よって生じた当然の変数名は処理系がプログラマ
がこの変数名に何を期待しているかというような
推論を行わなわず、したがって、スタック内の
変数ラベルをこれに置き換えるというようなコスト
のかかる作業を行わないため表示されることがない。
あとで続きを書きます。
どういう局面で変数ラベルがプログラマの期待通り
表示されるのかという問題と考えよう。
処理系によって異なるとおもうけれど、Heap領域に
元々の変数のラベルと現在の変数の一意名(大きの
場合番号)の対応表が確保される。この対応表が
Prologの処理系によって参照されるのは、
・listingなど定義節の表示(これは否応なくHeap
領域の参照が生じる。そのついで)
・インタプリタのトップレベルのインタプリタ側が
サービスとして表示する変数名。
であって、
?- atom_to_term('X',A,Varlist),write(A),nl.
を実行しても、
このトップレベルには変数Xが存在しないため、
_G24689
A = _G24689
yes としか表示されない。
つまり、トップレベルに現れる変数は例外として、
反駁途中stack領域内でのユニフィケーションに
よって生じた当然の変数名は処理系がプログラマ
がこの変数名に何を期待しているかというような
推論を行わなわず、したがって、スタック内の
変数ラベルをこれに置き換えるというようなコスト
のかかる作業を行わないため表示されることがない。
あとで続きを書きます。
146自己レス
2011/01/24(月) 07:05:00 >>145
ごめんなさい。まちがえました。
?- atom_to_term('X',U,Varlist),write(U),nl. を実行すると、
_G24689
Varlist = ['X' = U]
となります。注目はwriteで表示される変数はUでもXでもなく、
_G24689であるという点です。
ごめんなさい。まちがえました。
?- atom_to_term('X',U,Varlist),write(U),nl. を実行すると、
_G24689
Varlist = ['X' = U]
となります。注目はwriteで表示される変数はUでもXでもなく、
_G24689であるという点です。
147デフォルトの名無しさん
2011/01/24(月) 11:43:29 consult/1やreconsult/1でファイルからソースプログラムを
読み込むときは、読み込んだ文字列をparse_atomして、第三
引数のVarlistをヒープ領域に、変数名と定義した節構造の
中の変数Idのペア、として登録します。
ユーザがreadしてからassertする場合は、処理系によります。
assertz_with_namesのようなVarlist処理をオプションに
持った処理系の場合は,
?- ... read_with_names(P,V),assertz_with_name(P,V), ...
としておくことで、後にユーザが指定したかった変数名を
あくまで字面だけの問題ではありますが、「復元」するこ
とができます。
このようなオプションがあれば、より高度なインタプリタを
構築したり、マクロ処理を取り入れる場合には、この復元
を使うことによって、使い易い、分かりやすい、インタブリタ
やデバッガを作成することができます。
しかし、これらのことはあくまで変数を表示する際の「字面」
だけの問題であり、Prolog実行時のユニフィケーションに
よる、スタックの書き換え処理では、そのすべてが無機的な
変数Idの単一化だけで処理されている、ということを理解
する必要があります。
読み込むときは、読み込んだ文字列をparse_atomして、第三
引数のVarlistをヒープ領域に、変数名と定義した節構造の
中の変数Idのペア、として登録します。
ユーザがreadしてからassertする場合は、処理系によります。
assertz_with_namesのようなVarlist処理をオプションに
持った処理系の場合は,
?- ... read_with_names(P,V),assertz_with_name(P,V), ...
としておくことで、後にユーザが指定したかった変数名を
あくまで字面だけの問題ではありますが、「復元」するこ
とができます。
このようなオプションがあれば、より高度なインタプリタを
構築したり、マクロ処理を取り入れる場合には、この復元
を使うことによって、使い易い、分かりやすい、インタブリタ
やデバッガを作成することができます。
しかし、これらのことはあくまで変数を表示する際の「字面」
だけの問題であり、Prolog実行時のユニフィケーションに
よる、スタックの書き換え処理では、そのすべてが無機的な
変数Idの単一化だけで処理されている、ということを理解
する必要があります。
148143
2011/01/24(月) 22:53:06 >>147
質問が不適切だったと思います。
一般的に言うと、文字列として表現した節を、プログラムとしての節に変換するにはどうすればいいかということです。
外部のテキストをプログラムとして読み込めるなら、内部で「']と「']で囲まれた文字列をプログラムとして読み込めてもいいと思います。
質問が不適切だったと思います。
一般的に言うと、文字列として表現した節を、プログラムとしての節に変換するにはどうすればいいかということです。
外部のテキストをプログラムとして読み込めるなら、内部で「']と「']で囲まれた文字列をプログラムとして読み込めてもいいと思います。
149148
2011/01/24(月) 23:10:15 atom_to_termという述語を使えばいいと分かりました。
まったくの素人レベルのことです。
まったくの素人レベルのことです。
150デフォルトの名無しさん
2011/01/25(火) 18:57:10151デフォルトの名無しさん
2011/03/03(木) 19:28:07.67 あげるべきだろう
152デフォルトの名無しさん
2011/03/08(火) 07:50:13.35 http://nojiriko.asia/prolog/mojiretsu.pro
このサイトの後半部分は正規表現で書くことが
できるものをProlog述語で定義するとどうなるかと
いう課題への解答が集められています。
やはり、正規表現では1行で済むところが述語定義
では7-8行、場合によると10行以上になる場合も
少なくありません。しかし、ここで私が問いかけたいのは、
記述の効率性の問題だけではなく、これらの述語の名前と
して、正規表現として正解の表現を置いたとすると、この
述語名の解説としてPrologコードがどの程度有効な
ものになっているか、と言う観点です。(注1)
この観点からは、Prologは相当に優秀な言語だといえる
のではないか。そうであるといいなと思っています。
(注1) 残念ながら、正規表現の正解が元サイトでも
今ひとつはっきりしないため、述語名は日本語での
表現になっています。
このサイトの後半部分は正規表現で書くことが
できるものをProlog述語で定義するとどうなるかと
いう課題への解答が集められています。
やはり、正規表現では1行で済むところが述語定義
では7-8行、場合によると10行以上になる場合も
少なくありません。しかし、ここで私が問いかけたいのは、
記述の効率性の問題だけではなく、これらの述語の名前と
して、正規表現として正解の表現を置いたとすると、この
述語名の解説としてPrologコードがどの程度有効な
ものになっているか、と言う観点です。(注1)
この観点からは、Prologは相当に優秀な言語だといえる
のではないか。そうであるといいなと思っています。
(注1) 残念ながら、正規表現の正解が元サイトでも
今ひとつはっきりしないため、述語名は日本語での
表現になっています。
153デフォルトの名無しさん
2011/03/08(火) 20:45:35.91 同じサイトのこちらでは、
http://nojiriko.asia/prolog/onmemory_database.html
Prolog単位節をオンメモリデータベースに見立てて、
SQLによる問い合わせと等価なProlog述語定義を
試みています。
http://nojiriko.asia/prolog/onmemory_database.html
Prolog単位節をオンメモリデータベースに見立てて、
SQLによる問い合わせと等価なProlog述語定義を
試みています。
154デフォルトの名無しさん
2011/03/08(火) 21:29:14.81155デフォルトの名無しさん
2011/03/13(日) 04:44:42.40 「いろんな言語で宿題スレ」での出題に
対するProlog解答を集めたWebサイト
http://nojiriko.asia/prolog/
は現在1600解答を集めました。
先週、主要述語の用例集をこのサイトに集めた
解答から抜き出して追加しました。
各用例の題材は現在は出現順にならんで
いますが、今後のこれを意味別に並べ直すつもりです。
解説も極く一部しかついていませんが、意味別に
大分して、それに対して解説を追加する予定です。
最終的には、さらに主要Prolog処理系の互換性を
取るための述語などをここにします。
対するProlog解答を集めたWebサイト
http://nojiriko.asia/prolog/
は現在1600解答を集めました。
先週、主要述語の用例集をこのサイトに集めた
解答から抜き出して追加しました。
各用例の題材は現在は出現順にならんで
いますが、今後のこれを意味別に並べ直すつもりです。
解説も極く一部しかついていませんが、意味別に
大分して、それに対して解説を追加する予定です。
最終的には、さらに主要Prolog処理系の互換性を
取るための述語などをここにします。
156155
2011/03/13(日) 04:46:48.84 訂正 最終行 ここにします。 -> ここに追加します。
157デフォルトの名無しさん
2011/04/17(日) 09:16:01.11 x-euc-jpはeuc-jpにして欲しい…
158デフォルトの名無しさん
2011/04/23(土) 15:05:55.54 エキスパートシステムとか書けたりする?
159デフォルトの名無しさん
2011/04/23(土) 17:33:12.15 >>158
Prologはエキスパートシステム記述するための
言語のひとつということになっている。
私が書いたことがあるか、とか、今書けるかという意味だと
すると、答えは、
20年前には結構書いた。業務用も含めて。
対象が定まれば、サンプル的な短いものなら今でも書ける。
大別して前向き推論によるものと後ろ向き推論のものが
あるが、私は全て後ろ向き。
Prologにとってはこちらの方が自然ということらしい。
Prologはエキスパートシステム記述するための
言語のひとつということになっている。
私が書いたことがあるか、とか、今書けるかという意味だと
すると、答えは、
20年前には結構書いた。業務用も含めて。
対象が定まれば、サンプル的な短いものなら今でも書ける。
大別して前向き推論によるものと後ろ向き推論のものが
あるが、私は全て後ろ向き。
Prologにとってはこちらの方が自然ということらしい。
160デフォルトの名無しさん
2011/04/25(月) 23:18:32.73 エキスパートシステム書けるのですか。
…冷静に考えればprologなればこそ書けなきゃおかしいか。
IBMがprologで自然言語処理がうんたらかんたらしてるらしいので
もっと注目されてほしいなぁ。
…冷静に考えればprologなればこそ書けなきゃおかしいか。
IBMがprologで自然言語処理がうんたらかんたらしてるらしいので
もっと注目されてほしいなぁ。
161デフォルトの名無しさん
2011/04/27(水) 18:00:50.94 >>160
急に注目されはじめたようですよ。
急に注目されはじめたようですよ。
162デフォルトの名無しさん
2011/04/27(水) 19:57:36.82 エキスパートシステムなんてどんな言語でも簡単に書ける。
prologはファクトの無限導出を副作用をつかって
避ける必要があるので、むしろ面倒なくらいだ。
prologはファクトの無限導出を副作用をつかって
避ける必要があるので、むしろ面倒なくらいだ。
163デフォルトの名無しさん
2011/04/27(水) 20:58:39.35 >>162
「どんな言語でも」書けるもんなら書いてくれ。
「どんな言語でも」書けるもんなら書いてくれ。
164デフォルトの名無しさん
2011/04/28(木) 11:32:17.24 どんな言語でもというと語弊があるだろうけど、そんなに難しいものでは
ないという点には同意。
Prologだとappendだけで書けるレベル。かってはスタックオーバーフローや
GCの頻発に悩みながらだったが、現在は、2GB以上のプロセスが当たり前で
データをすべて引数で持ち回っても問題はない。
Prologの利点は、何といっても作り込みが容易なこと。業種、企業、生産現場に
よって、全く異なるデータのサンプリングの方法を仕様がしっかり文章化されて
いれば、簡単に述語として追加・変更できることだろう。
ないという点には同意。
Prologだとappendだけで書けるレベル。かってはスタックオーバーフローや
GCの頻発に悩みながらだったが、現在は、2GB以上のプロセスが当たり前で
データをすべて引数で持ち回っても問題はない。
Prologの利点は、何といっても作り込みが容易なこと。業種、企業、生産現場に
よって、全く異なるデータのサンプリングの方法を仕様がしっかり文章化されて
いれば、簡単に述語として追加・変更できることだろう。
165デフォルトの名無しさん
2011/04/28(木) 11:50:39.82 最近のエキスパートシステム事情には疎いのだけれど、
かっては確かにルールをシンボル化してその論理式を
assert,retractしながら利用するというような手法が
使われていたと思うけど、今は、
非決定性のappend/3 を ...,apppend(L1,[A|L2],L),filter(A,B), ...
のように使って、例えば、Bの排他的要素がL1,L2に存在
するか確かめながら(これもappend/3)進むというような
ものがほとんどだと思う。
かっては確かにルールをシンボル化してその論理式を
assert,retractしながら利用するというような手法が
使われていたと思うけど、今は、
非決定性のappend/3 を ...,apppend(L1,[A|L2],L),filter(A,B), ...
のように使って、例えば、Bの排他的要素がL1,L2に存在
するか確かめながら(これもappend/3)進むというような
ものがほとんどだと思う。
166デフォルトの名無しさん
2011/04/28(木) 23:29:22.17 >>164
私が今書くとすると、"Prolog Programming For Artificial Inteligence" の14章を
一度読みなおしてからということになるが、十分に難しいよ。
他の言語でやさしいかどうかは知らないが。
私が今書くとすると、"Prolog Programming For Artificial Inteligence" の14章を
一度読みなおしてからということになるが、十分に難しいよ。
他の言語でやさしいかどうかは知らないが。
167デフォルトの名無しさん
2011/04/29(金) 00:45:50.54 Prolog全然使えん。簡単なループ文書くのですら一苦労だ。
168デフォルトの名無しさん
2011/04/29(金) 12:35:51.70 斬新な用途ですね。
169デフォルトの名無しさん
2011/04/29(金) 21:02:38.40 prologが得意な人は行列積とかどんな風に書くのかな
自分で書くと、とても綺麗とはいえないコードになる
自分で書くと、とても綺麗とはいえないコードになる
170デフォルトの名無しさん
2011/04/29(金) 22:04:54.18 線形代数関係は、LAPACKに処理を投げるのがプログラミングの定石では?
PrologからLAPACKにどうやって処理を投げるのか知らないけど。
PrologからLAPACKにどうやって処理を投げるのか知らないけど。
171デフォルトの名無しさん
2011/04/29(金) 22:13:50.07 実用にするならそうだね。
ただ、言語のプログラミングスタイルの話だから…
ただ、言語のプログラミングスタイルの話だから…
172デフォルトの名無しさん
2011/04/30(土) 10:38:28.54173デフォルトの名無しさん
2011/04/30(土) 11:22:20.41 >>172
私が今書くとすると、"Matrix Computations 3rd Edition"を
一度読みなおしてからということになるが、十分に難しいよ。
他の言語でやさしいかどうかは知らないが。
私が今書くとすると、"Matrix Computations 3rd Edition"を
一度読みなおしてからということになるが、十分に難しいよ。
他の言語でやさしいかどうかは知らないが。
174デフォルトの名無しさん
2011/04/30(土) 12:01:22.84 >>173
> 他の言語でやさしいかどうかは知らないが。
APLという軟弱言語なら演算子三文字。
軟弱言語巡りをしてPrologにも立ち寄っているけど、
何を書いてもエラーか無限再帰になってしまう。
未だ正しい記述が出来ない orz
> 他の言語でやさしいかどうかは知らないが。
APLという軟弱言語なら演算子三文字。
軟弱言語巡りをしてPrologにも立ち寄っているけど、
何を書いてもエラーか無限再帰になってしまう。
未だ正しい記述が出来ない orz
175デフォルトの名無しさん
2011/04/30(土) 12:21:31.48 >>174
せめて計算環境にあわせてブロック分割くらいしようぜ
せめて計算環境にあわせてブロック分割くらいしようぜ
176デフォルトの名無しさん
2011/04/30(土) 13:21:02.33 >>174
こんな感じじゃないかな。個々の述語は単純だよ。
m_mult(L1,L2,X) :- m_trans(L2,L4),m_mult_1(L1,L4,X) .
m_trans([],[],[]) :- !.
m_trans([[A|R]|R1],[A|R2],[R|R3]) :- m_trans(R1,R2,R3) .
m_trans([[]|_],[]) :- !.
m_trans(L,[B|R1]) :- m_trans(L,B,R2),m_trans(R2,R1),!.
m_mult_1([],_,[]) :- !.
m_mult_1([A|R1],L,[S1|R3]) :- m_mult_2(A,L,S1),m_mult_1(R1,L,R3).
m_mult_2(_,[],[]) :- !.
m_mult_2(A,[B|R2],[C|R3]) :- m_mult_3(A,B,C), m_mult_2(A,R2,R3).
m_mult_3([],[],0) :- !.
m_mult_3([A|R1],[B|R2],S) :- S1 is A * B,m_mult_3(R1,R2,S2),S is S1 + S2.
こんな感じじゃないかな。個々の述語は単純だよ。
m_mult(L1,L2,X) :- m_trans(L2,L4),m_mult_1(L1,L4,X) .
m_trans([],[],[]) :- !.
m_trans([[A|R]|R1],[A|R2],[R|R3]) :- m_trans(R1,R2,R3) .
m_trans([[]|_],[]) :- !.
m_trans(L,[B|R1]) :- m_trans(L,B,R2),m_trans(R2,R1),!.
m_mult_1([],_,[]) :- !.
m_mult_1([A|R1],L,[S1|R3]) :- m_mult_2(A,L,S1),m_mult_1(R1,L,R3).
m_mult_2(_,[],[]) :- !.
m_mult_2(A,[B|R2],[C|R3]) :- m_mult_3(A,B,C), m_mult_2(A,R2,R3).
m_mult_3([],[],0) :- !.
m_mult_3([A|R1],[B|R2],S) :- S1 is A * B,m_mult_3(R1,R2,S2),S is S1 + S2.
177デフォルトの名無しさん
2011/05/05(木) 11:19:35.03 コピペなんですがこういうのも論理型言語で記述できるのでしょうか?
> 357 :名無しさん@涙目です。(東京都):2011/05/02(月) 19:15:52.75 ID:Of9kzpjA0
> こんなのもあるな
> 登場人物は4人。(男の子、女の子、アイスクリーム屋さん、お母さん)
>
> 男の子と女の子が公園で遊んでいると、アイスクリーム屋さんがきます。
> ふたりはアイスが食べたいが、男の子はお金を持っていません。
> アイスクリーム屋さんが「今日はずっと公園でお店やるよ。」 というので、男の子は家にお金を取りに行きます。
> 途中でアイスクリーム屋さんの気が変わり、学校でお店を出すことになり
> 女の子に「男の子に学校に来るように伝えに行って」と、頼みます。
> アイスクリーム屋さんが、学校に向かう途中で、お金を取りに行った男の子に会います。
> アイスクリーム屋さんは男の子に学校にお店を出すことにした事を伝え、一緒に学校に行きます。
> その頃、家に着いた女の子はお母さんから、「男の子は、もうアイスを買いに行った」ことを、聞きます。
>
> さて、ここで問題です。女の子はどこに男の子を探しに行くでしょうか?
> 357 :名無しさん@涙目です。(東京都):2011/05/02(月) 19:15:52.75 ID:Of9kzpjA0
> こんなのもあるな
> 登場人物は4人。(男の子、女の子、アイスクリーム屋さん、お母さん)
>
> 男の子と女の子が公園で遊んでいると、アイスクリーム屋さんがきます。
> ふたりはアイスが食べたいが、男の子はお金を持っていません。
> アイスクリーム屋さんが「今日はずっと公園でお店やるよ。」 というので、男の子は家にお金を取りに行きます。
> 途中でアイスクリーム屋さんの気が変わり、学校でお店を出すことになり
> 女の子に「男の子に学校に来るように伝えに行って」と、頼みます。
> アイスクリーム屋さんが、学校に向かう途中で、お金を取りに行った男の子に会います。
> アイスクリーム屋さんは男の子に学校にお店を出すことにした事を伝え、一緒に学校に行きます。
> その頃、家に着いた女の子はお母さんから、「男の子は、もうアイスを買いに行った」ことを、聞きます。
>
> さて、ここで問題です。女の子はどこに男の子を探しに行くでしょうか?
178デフォルトの名無しさん
2011/05/10(火) 17:16:11.53 よくわからんけど、これは情報格差を見失わないでいられるか、みたいなのを確かめる試験みたいなもので、
パズルではないような
パズルではないような
179デフォルトの名無しさん
2011/05/10(火) 19:26:17.19 発達心理学の有名な問題で、
女の子が一定年齢以下だと公園に行くけど、一定年齢以上だと学校に行くとか、そんな話じゃなかったかと。
女の子が一定年齢以下だと公園に行くけど、一定年齢以上だと学校に行くとか、そんな話じゃなかったかと。
180デフォルトの名無しさん
2011/05/10(火) 20:14:33.59 「女の子は男の子が学校に向かうことを知っているか?」
とかそんな形でモデル化できないこともないかな。
この場合「知らない」なので「公園に行く」になるような。
その文章が表現してる知識全部がうまくいくかどうかはわからない。
>>179 逆かな。
とかそんな形でモデル化できないこともないかな。
この場合「知らない」なので「公園に行く」になるような。
その文章が表現してる知識全部がうまくいくかどうかはわからない。
>>179 逆かな。
181デフォルトの名無しさん
2011/05/11(水) 18:29:25.78182デフォルトの名無しさん
2011/05/11(水) 18:48:08.31 自然言語の曖昧さとかに依存してるなら難しいけど、
(有名な例では、
「宵の明星は金星である」「金星は宵の明星である」
「明けの明星は金星である」「金星は明けの明星である」はいずれも真である。
では、「宵の明星は明けの明星である」は真か、みたいな)
入り組んでいるだけなら論理として扱えると思うけどね。
(有名な例では、
「宵の明星は金星である」「金星は宵の明星である」
「明けの明星は金星である」「金星は明けの明星である」はいずれも真である。
では、「宵の明星は明けの明星である」は真か、みたいな)
入り組んでいるだけなら論理として扱えると思うけどね。
183デフォルトの名無しさん
2011/05/11(水) 21:02:08.06184デフォルトの名無しさん
2011/05/11(水) 21:12:23.17 訂正
× Socrates
○ socrates
だった。
あと女の子の応答もYes/Noだ。
× Socrates
○ socrates
だった。
あと女の子の応答もYes/Noだ。
185デフォルトの名無しさん
2011/05/21(土) 23:11:01.23 あるリストから要素数Nの部分集合が全部ほしいんですがどうすればいいでしょうか?
186デフォルトの名無しさん
2011/05/21(土) 23:54:31.20 >>185
http://www.geocities.jp/m_hiroi/prolog/prolog02.html
部分集合の判定
selects([], Ys).
selects([X | Xs], Ys) :- select(X, Ys, Ys1), selects(Xs, Ys1).
http://www.geocities.jp/m_hiroi/prolog/prolog02.html
部分集合の判定
selects([], Ys).
selects([X | Xs], Ys) :- select(X, Ys, Ys1), selects(Xs, Ys1).
187デフォルトの名無しさん
2011/05/22(日) 00:13:53.59 >>186
はい、自分もそこを見て
selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z)
みたいにして要素数Zの部分集合を得て、さらに並べ替えがいらないんで
selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z),sort(Xs,Xs).
みたいにしたんですが、なんかすごくブサイクな感じなんでなんかないかなーと思いまして
はい、自分もそこを見て
selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z)
みたいにして要素数Zの部分集合を得て、さらに並べ替えがいらないんで
selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z),sort(Xs,Xs).
みたいにしたんですが、なんかすごくブサイクな感じなんでなんかないかなーと思いまして
188デフォルトの名無しさん
2011/05/22(日) 00:33:02.43 全生成して要素数N以外を捨てる
これが富豪か
これが富豪か
189デフォルトの名無しさん
2011/05/22(日) 02:41:57.82 >>187
http://www.geocities.jp/m_hiroi/prolog/yapp02.html
●問題32
?- combination(3, [a, b, c, d, e], X).
X = [a, b, c] ;
X = [a, b, d] ;
X = [a, b, e] ;
X = [a, c, d] ;
X = [a, c, e] ;
X = [a, d, e] ;
X = [b, c, d] ;
X = [b, c, e] ;
X = [b, d, e] ;
X = [c, d, e] ;
false.
http://www.geocities.jp/m_hiroi/prolog/yapp02.html
●問題32
?- combination(3, [a, b, c, d, e], X).
X = [a, b, c] ;
X = [a, b, d] ;
X = [a, b, e] ;
X = [a, c, d] ;
X = [a, c, e] ;
X = [a, d, e] ;
X = [b, c, d] ;
X = [b, c, e] ;
X = [b, d, e] ;
X = [c, d, e] ;
false.
190デフォルトの名無しさん
2011/05/22(日) 03:13:51.21191デフォルトの名無しさん
2011/05/27(金) 23:13:42.01 今、学生がprologを学ぶ意義って何だろう?
いや、個人的には活用してるけど、俺みたいな言語おたく以外の
普通の学生が、カットの挙動やら、失敗駆動ループやらを
頑張って勉強する価値はあるのかな。
たぶん、大多数はprologなんて一生使わないと思われる。
いや、個人的には活用してるけど、俺みたいな言語おたく以外の
普通の学生が、カットの挙動やら、失敗駆動ループやらを
頑張って勉強する価値はあるのかな。
たぶん、大多数はprologなんて一生使わないと思われる。
192デフォルトの名無しさん
2011/05/28(土) 00:09:52.15 この言語をマスターしたら論破できるようになるの?
193デフォルトの名無しさん
2011/05/28(土) 00:13:38.05194デフォルトの名無しさん
2011/05/28(土) 03:31:59.08 >>191
今後使うためとしか答えられない。我々の思考に最も
近い言語はやはりこの言語なのであって、その事が
評価される時が再び来るということだろう。
興味深いことは、結構優秀な学生にとっても
Prologは決してやさしくはないということ。これが謎。
今後使うためとしか答えられない。我々の思考に最も
近い言語はやはりこの言語なのであって、その事が
評価される時が再び来るということだろう。
興味深いことは、結構優秀な学生にとっても
Prologは決してやさしくはないということ。これが謎。
195デフォルトの名無しさん
2011/05/28(土) 05:00:47.97196デフォルトの名無しさん
2011/05/28(土) 08:26:06.18 >>195
大学の講座は論理学絡みだからね。前提が。
実務では、実際appendしか使いませんね。
append使うためにはリストに取らなくては
ならないから、変換器として、findallは
多用するけどね。
大学の講座は論理学絡みだからね。前提が。
実務では、実際appendしか使いませんね。
append使うためにはリストに取らなくては
ならないから、変換器として、findallは
多用するけどね。
197デフォルトの名無しさん
2011/05/28(土) 08:33:14.38 >>191
学ぶ意義のある言語というと、JavaとかCとか?
つまらん学校だw
本当の学校ってのは、遊びに行くところ。
prologの授業受けてトラウマ/コンプレックス/やみつきになるくらいでちょうど良い。
学ぶ意義のある言語というと、JavaとかCとか?
つまらん学校だw
本当の学校ってのは、遊びに行くところ。
prologの授業受けてトラウマ/コンプレックス/やみつきになるくらいでちょうど良い。
198デフォルトの名無しさん
2011/05/28(土) 08:36:19.95 SLDNFが人間の思考に近いとは思えんなあ。
prologで普遍的な価値があるのは純粋論理の部分だけじゃないか。
prologで普遍的な価値があるのは純粋論理の部分だけじゃないか。
199デフォルトの名無しさん
2011/05/28(土) 09:07:38.68200デフォルトの名無しさん
2011/05/28(土) 09:22:22.26201デフォルトの名無しさん
2011/05/28(土) 09:54:25.63202デフォルトの名無しさん
2011/05/28(土) 10:34:32.82 >>201
私もそれで十分だと思うけど。
私もそれで十分だと思うけど。
203デフォルトの名無しさん
2011/05/28(土) 10:43:29.71 要は事務屋のSQL代わりってわけか。
そんなものに多大な国家予算をつぎこんだ日本って…
そんなものに多大な国家予算をつぎこんだ日本って…
204デフォルトの名無しさん
2011/05/28(土) 11:07:06.71205デフォルトの名無しさん
2011/05/28(土) 15:33:51.21206デフォルトの名無しさん
2011/05/28(土) 15:37:15.41 >>194
>Prologは決してやさしくはない
手続き型がマシなだけで、関数型も論理
型も宣言型も同等にわかりにくいんだろ。
トップダウンのルールベースってのが
鬼門なんだろうな。
オレも、ややこしくなると結局、逐次的に
手続き的に処理を追っかけていくしな。
>Prologは決してやさしくはない
手続き型がマシなだけで、関数型も論理
型も宣言型も同等にわかりにくいんだろ。
トップダウンのルールベースってのが
鬼門なんだろうな。
オレも、ややこしくなると結局、逐次的に
手続き的に処理を追っかけていくしな。
207デフォルトの名無しさん
2011/05/28(土) 16:29:30.76 appendって何?リストの追加?
208デフォルトの名無しさん
2011/05/28(土) 16:48:35.26 >>207
?- append(L0,[X|R],[1,2,3]).
L0 = [],
X = 1,
R = [2,3];
L0 = [1],
X = 2,
R = [3];
L0 = [1,2],
X = 3,
R = [];
no.
?-
?- append(L0,[X|R],[1,2,3]).
L0 = [],
X = 1,
R = [2,3];
L0 = [1],
X = 2,
R = [3];
L0 = [1,2],
X = 3,
R = [];
no.
?-
209デフォルトの名無しさん
2011/05/28(土) 18:19:29.52 >>207
?- length(L0,3),append(L0,[X,Y|R],[1,2,3,4,5,6]).
L0 = [1,2,3],
X = 4,
Y = 5,
R = [6];
no.
?- length(L0,3),append(L0,[X,Y|R],[a,b,c,d,e,a]),append(_,[Z|_],L0),append(_,[Z|_],R).
L0 = [a,b,c],
X = d,
Y = e,
R = [a],
_ = [],
Z = a,
_ = [b,c],
_ = [],
_ = [];
no.
?-
?- length(L0,3),append(L0,[X,Y|R],[1,2,3,4,5,6]).
L0 = [1,2,3],
X = 4,
Y = 5,
R = [6];
no.
?- length(L0,3),append(L0,[X,Y|R],[a,b,c,d,e,a]),append(_,[Z|_],L0),append(_,[Z|_],R).
L0 = [a,b,c],
X = d,
Y = e,
R = [a],
_ = [],
Z = a,
_ = [b,c],
_ = [],
_ = [];
no.
?-
210デフォルトの名無しさん
2011/05/28(土) 18:24:29.21 >>207
select(A,L,X) :- append(L0,[A|R],L),append(L0,R,X).
?- select(A,[1,2,3],X).
A = 1,
X = [2,3];
A = 2,
X = [1,3];
A = 3,
X = [1,2];
no.
?-
select(A,L,X) :- append(L0,[A|R],L),append(L0,R,X).
?- select(A,[1,2,3],X).
A = 1,
X = [2,3];
A = 2,
X = [1,3];
A = 3,
X = [1,2];
no.
?-
211デフォルトの名無しさん
2011/05/28(土) 18:40:40.85212デフォルトの名無しさん
2011/05/28(土) 19:07:00.82 >>207
カンマで括られた文字列の検索(_文字列,_適合文字列) :-
atom_chars(_文字列,Chars),
append(_,[','|L1],Chars),
append(L01,[','|_],L1),
\+(append(_,[','|_],L01)),
atom_chars(_適合文字列,L01).
カンマで括られた文字列の検索(_文字列,_適合文字列) :-
atom_chars(_文字列,Chars),
append(_,[','|L1],Chars),
append(L01,[','|_],L1),
\+(append(_,[','|_],L01)),
atom_chars(_適合文字列,L01).
213デフォルトの名無しさん
2011/05/28(土) 20:29:06.72 なにこれ、こわい
214デフォルトの名無しさん
2011/05/28(土) 21:25:53.31 >213
自分のやってることの意味を考えずに生きてきて、
ついにコードを見せることしかできなくなった
哀れな技術者の末路です
そっとしておいてあげてください。
自分のやってることの意味を考えずに生きてきて、
ついにコードを見せることしかできなくなった
哀れな技術者の末路です
そっとしておいてあげてください。
>>203
このスレ 残滓で満ちてそう…
このスレ 残滓で満ちてそう…
216デフォルトの名無しさん
2011/05/28(土) 22:46:02.81217デフォルトの名無しさん
2011/05/28(土) 22:51:48.86 そうだね、100通りでも200通りでもかけるね。
そうやって、無意味なことに貴重な税金を無駄遣いしてきたわけか。
そうやって、無意味なことに貴重な税金を無駄遣いしてきたわけか。
218デフォルトの名無しさん
2011/05/28(土) 23:20:33.96219デフォルトの名無しさん
2011/05/28(土) 23:28:52.02 だから、その行為をどう意義づけているの?
それは70年近いプログラミングの発展史のなかでどう位置づけられるの?
それを語らずにコードを垂れ流しても何の意味もない。
それは70年近いプログラミングの発展史のなかでどう位置づけられるの?
それを語らずにコードを垂れ流しても何の意味もない。
220デフォルトの名無しさん
2011/05/29(日) 03:43:12.57 Prolog製の商用アプリケーションにGeneXusってのあるから何が出来るのか調べてみたらどうだい。
http://www.atmarkit.co.jp/im/cae/reports/0701/01.html
http://www.nikkei.com/tech/business/article/g=96958A9C93819499E2EAE2E2838DE2EAE3E0E0E2E3E2E2E2E2E2E2E2
http://itpro.nikkeibp.co.jp/article/COLUMN/20101207/354963/
http://itpro.nikkeibp.co.jp/article/Watcher/20101001/352528/
http://www.atmarkit.co.jp/im/cae/reports/0701/01.html
http://www.nikkei.com/tech/business/article/g=96958A9C93819499E2EAE2E2838DE2EAE3E0E0E2E3E2E2E2E2E2E2E2
http://itpro.nikkeibp.co.jp/article/COLUMN/20101207/354963/
http://itpro.nikkeibp.co.jp/article/Watcher/20101001/352528/
221デフォルトの名無しさん
2011/05/29(日) 06:49:35.85 >[注2]「シーシャープ」と読む。CやC++をベースに米マイクロソフトが開発し、2000年6月に発表したプログラミング言語。
>従来のCやC++との違いは、インターネット経由でアプリケーション・サービスを提供するWebサービスに対応すること
日経・・・
>従来のCやC++との違いは、インターネット経由でアプリケーション・サービスを提供するWebサービスに対応すること
日経・・・
222デフォルトの名無しさん
2011/05/29(日) 07:38:29.49 > 「プログラマはもう要らない」。
> 大手物流会社のシステム子会社で新技術の社内展開を進めるマネージャーはこう言い切る。
> ここでいうプログラマとは、企業情報システムの開発プロジェクトでプログラムを作成する担当者を指す。
お前ら、もう要らないらしいw
> 大手物流会社のシステム子会社で新技術の社内展開を進めるマネージャーはこう言い切る。
> ここでいうプログラマとは、企業情報システムの開発プロジェクトでプログラムを作成する担当者を指す。
お前ら、もう要らないらしいw
223デフォルトの名無しさん
2011/05/29(日) 07:53:41.82224デフォルトの名無しさん
2011/05/29(日) 08:26:23.42 この記事を使って、リストラが進められそうだな。
「ツール導入で生産性が20倍になりますので、人員を1/20に削減します」
「ツール導入で生産性が20倍になりますので、人員を1/20に削減します」
225デフォルトの名無しさん
2011/05/29(日) 08:50:03.16226デフォルトの名無しさん
2011/05/29(日) 08:52:30.24 どんどんやって、どんどん潰れっちまえ
227デフォルトの名無しさん
2011/05/29(日) 09:27:54.50 それはいいが、prologの名前をこんないんちき商売に
使うのはやめて欲しい。
使うのはやめて欲しい。
228デフォルトの名無しさん
2011/05/29(日) 09:52:32.48 >>227
使ってみたことあるのかい?
使ってみたことあるのかい?
229デフォルトの名無しさん
2011/05/29(日) 12:15:34.41 >従来のCやC++との違いは、インターネット経由でアプリケーション・サービスを提供するWebサービスに対応すること
.NETをインターネットの事か何かだと思ったんだろうな
.NETをインターネットの事か何かだと思ったんだろうな
230デフォルトの名無しさん
2011/05/31(火) 08:36:17.56231デフォルトの名無しさん
2011/06/01(水) 12:41:08.98 >>230 引数一切なし?
232デフォルトの名無しさん
2011/06/04(土) 16:42:06.23 Prologって業務ロジックを抽象的に表すのには向いているんじゃないだろうか
流行りの(?)DSLとかの代わりにならないかな
流行りの(?)DSLとかの代わりにならないかな
233デフォルトの名無しさん
2011/06/04(土) 18:05:49.85 >>232
これ以上向いている言語はないと思うけど。
速度を要求されない、複雑化の可能性のあるロジックに
ついては、開発速度、プログラマの養成の容易さ、
保守のしやすさ、全ての点で優れている。
欠点はオブジェクト指向言語でなくて、.NETから外れて
いることかな。
これ以上向いている言語はないと思うけど。
速度を要求されない、複雑化の可能性のあるロジックに
ついては、開発速度、プログラマの養成の容易さ、
保守のしやすさ、全ての点で優れている。
欠点はオブジェクト指向言語でなくて、.NETから外れて
いることかな。
234デフォルトの名無しさん
2011/06/04(土) 20:53:49.88 おおすごい。
なんで普及していない/普及しなかったんだろう?
なんで普及していない/普及しなかったんだろう?
235デフォルトの名無しさん
2011/06/05(日) 06:47:44.50 swi-prolog 5.11.14 で日本語が通りません。
'親子'('茂雄', '一茂')
.
のような日本語述語や日本語の項はUTF-8で書いて、
クォートでくくれば読み込めるんですが
listing しても文字化けしています。
日本語述語で問い合わせしても、そんな述語はないといわれます。
何か設定等必要なのでしょうか?
環境はwindows xp sp2です。
'親子'('茂雄', '一茂')
.
のような日本語述語や日本語の項はUTF-8で書いて、
クォートでくくれば読み込めるんですが
listing しても文字化けしています。
日本語述語で問い合わせしても、そんな述語はないといわれます。
何か設定等必要なのでしょうか?
環境はwindows xp sp2です。
236デフォルトの名無しさん
2011/06/11(土) 18:07:04.52 750 :デフォルトの名無しさん[sage]:2008/12/23(火) 10:10:50
>>747
http://www.swi-prolog.org/versions.html
UTF-8対応は5.6.x(開発版では5.5.x)から
>>747
http://www.swi-prolog.org/versions.html
UTF-8対応は5.6.x(開発版では5.5.x)から
237デフォルトの名無しさん
2011/06/11(土) 18:08:07.51 おっと5.11.14かごめんw
238天使 ◆uL5esZLBSE
2011/07/01(金) 18:39:03.66239デフォルトの名無しさん
2011/07/11(月) 10:57:06.09 ぷろろぐ
240デフォルトの名無しさん
2011/07/13(水) 20:40:07.15 探索とかもろ並列処理できそうな
マルチコア時代の今なら並列prologとか出てこないかしら?
マルチコア時代の今なら並列prologとか出てこないかしら?
241デフォルトの名無しさん
2011/07/13(水) 21:37:00.70 お好きなのをどうぞ
concurrent prolog
parlog
ghc
kl1
strand
concurrent prolog
parlog
ghc
kl1
strand
242デフォルトの名無しさん
2011/07/13(水) 23:41:15.56243デフォルトの名無しさん
2011/07/14(木) 04:09:18.84 統合失調症の人にそんなこと言っても無駄
244デフォルトの名無しさん
2011/07/14(木) 14:41:46.26245デフォルトの名無しさん
2011/07/15(金) 03:23:58.99246デフォルトの名無しさん
2011/07/15(金) 05:33:59.23 >>240
http://nojiriko.asia/prolog/c135_256.html
AZ-Prolog処理系作者によって書かれたMPIライクな
マルチプロセス並列処理機能の使用プログラム。
http://nojiriko.asia/prolog/c135_256.html
AZ-Prolog処理系作者によって書かれたMPIライクな
マルチプロセス並列処理機能の使用プログラム。
247デフォルトの名無しさん
2011/08/21(日) 10:38:06.34 JVM上で動作し、Javaからも呼び出し可能なprologがあれば!
248デフォルトの名無しさん
2011/08/22(月) 09:38:53.46 prolog cafeがありますよ
249デフォルトの名無しさん
2011/08/22(月) 15:03:23.52250デフォルトの名無しさん
2011/09/07(水) 11:51:09.81 完全な素人です。素朴な疑問なのですが、
同じ事をする場合、手続き的言語と比べて明らかに効率が悪くなる処理とかありますか?
例えばユニフィケーションって処理的にかなり重い気がします。
他にも配列と比べるとリストでは先頭の値しか扱えないとか、再帰呼び出しで
(一つ減らして)全要素を毎回コピーするとか手続き型の先入観を持ってると
効率が悪い気がするのですが、理屈の上では処理が増えるとか言う事は無いのでしょうか?
記憶領域もN^2/2とか必要になりそうですし。
ユニフィケーションのコストってどの位と見積もれるものでしょうか?
事実の数が10倍になると10倍の処理が必要なのですか?
それともSQLのインデックスみたいな事、もしくはキャッシュみたいなものを持っていて
それ程増えないのでしょうか?
変な事を書いているかも知れませんので、疑問自体がおかしいみたいな指摘でも結構です。
よろしくお願いします。
同じ事をする場合、手続き的言語と比べて明らかに効率が悪くなる処理とかありますか?
例えばユニフィケーションって処理的にかなり重い気がします。
他にも配列と比べるとリストでは先頭の値しか扱えないとか、再帰呼び出しで
(一つ減らして)全要素を毎回コピーするとか手続き型の先入観を持ってると
効率が悪い気がするのですが、理屈の上では処理が増えるとか言う事は無いのでしょうか?
記憶領域もN^2/2とか必要になりそうですし。
ユニフィケーションのコストってどの位と見積もれるものでしょうか?
事実の数が10倍になると10倍の処理が必要なのですか?
それともSQLのインデックスみたいな事、もしくはキャッシュみたいなものを持っていて
それ程増えないのでしょうか?
変な事を書いているかも知れませんので、疑問自体がおかしいみたいな指摘でも結構です。
よろしくお願いします。
251デフォルトの名無しさん
2011/09/07(水) 18:21:14.48 >>250
Prologは最も速いコンパイラ言語の100倍以上遅いでしょう。
その理由の過半がユニフィケーションと変数の繰り返し出現検査に
あると思います。指摘されたように配列がないこともある場合には
原因となります。それに比べればトレイルスタック等の追加的処理は
大きなコストになっていないはずです。
明らかに遅くて使えないのはビットマップの処理ですね。繰り返し
数百万のビットに対して演算する場合です。RPGも無理でしょう。
Prologはオンメモリデータベースですから、そこそこ速いのですが、
Prologが再起するためには、あなたが指摘したとおり、インデックス
などによる最適化によって、定義アトムを検索する能力を高める
必要があると思います。現在のレベルでは、数百万節の検索を
掛ける気になりません。
Prologは最も速いコンパイラ言語の100倍以上遅いでしょう。
その理由の過半がユニフィケーションと変数の繰り返し出現検査に
あると思います。指摘されたように配列がないこともある場合には
原因となります。それに比べればトレイルスタック等の追加的処理は
大きなコストになっていないはずです。
明らかに遅くて使えないのはビットマップの処理ですね。繰り返し
数百万のビットに対して演算する場合です。RPGも無理でしょう。
Prologはオンメモリデータベースですから、そこそこ速いのですが、
Prologが再起するためには、あなたが指摘したとおり、インデックス
などによる最適化によって、定義アトムを検索する能力を高める
必要があると思います。現在のレベルでは、数百万節の検索を
掛ける気になりません。
252250
2011/09/07(水) 19:29:25.63 >>251
丁寧な回答ありがとうございます。
確かにエンコードなんかで大量のデータをランダムに走査するとか不得意そうですね。
100倍程度なら何とか許容出来るのかもしれません。
ただ、ユニフィケーションの実際の動作が見えないのが気になるんです。
現在の処理系では検索用のヒントみたいなのは指定出来ないと言う事ですよね?少し不安です。
全体で100万件位の事実を想定しているもので。
ユニフィケーションの速度を上げたいのですが、
事実を分割して該当しそうなもののみ指定して検索させるとか可能でしょうか?
(デーブルを分割する様なイメージです)
グループ分けの規則を介する事になってかえって遅くなったりします?
丁寧な回答ありがとうございます。
確かにエンコードなんかで大量のデータをランダムに走査するとか不得意そうですね。
100倍程度なら何とか許容出来るのかもしれません。
ただ、ユニフィケーションの実際の動作が見えないのが気になるんです。
現在の処理系では検索用のヒントみたいなのは指定出来ないと言う事ですよね?少し不安です。
全体で100万件位の事実を想定しているもので。
ユニフィケーションの速度を上げたいのですが、
事実を分割して該当しそうなもののみ指定して検索させるとか可能でしょうか?
(デーブルを分割する様なイメージです)
グループ分けの規則を介する事になってかえって遅くなったりします?
253デフォルトの名無しさん
2011/09/07(水) 20:17:55.44 >>252
PSI(新世代コンピュータ開発機構が開発したPrologマシン)では
確か、第一引数にハッシュでインデックスが自動付加されたように
記憶していますが、その程度のものはコンパイラにはあると思います。
しかし、全ての引数にBtreeに類するインデックスを設定できる
コンパイラはないのではないか。
PSI(新世代コンピュータ開発機構が開発したPrologマシン)では
確か、第一引数にハッシュでインデックスが自動付加されたように
記憶していますが、その程度のものはコンパイラにはあると思います。
しかし、全ての引数にBtreeに類するインデックスを設定できる
コンパイラはないのではないか。
254250
2011/09/07(水) 21:39:48.53255デフォルトの名無しさん
2011/09/13(火) 00:06:34.91 Prologを極めることによって、ディベートに強くなれますか?
256デフォルトの名無しさん
2011/09/13(火) 00:18:33.33 NO
257デフォルトの名無しさん
2011/09/13(火) 00:21:14.76 Prologを極めると友達が一人もいなくなります
258デフォルトの名無しさん
2011/09/13(火) 00:23:26.60 むしろPrologがお友達になります
259デフォルトの名無しさん
2011/09/14(水) 01:28:33.81 Prolog極めてないのに友達がいないのですがどうすればいいですか?
260デフォルトの名無しさん
2011/09/14(水) 01:36:13.38 ロンリープログラミングですね。わかりますん
261デフォルトの名無しさん
2011/09/20(火) 07:51:09.68262デフォルトの名無しさん
2011/09/20(火) 08:03:20.00 最近、うちの子がパソコンを眺めて「ともだち…ともだち…ウヘ」と独り言ちているのですが、どうしたらいいでしょうか。
263デフォルトの名無しさん
2011/09/20(火) 11:25:37.87 友達を蹴ったり、食べたりしないように注意しとけ
264デフォルトの名無しさん
2011/10/06(木) 20:49:10.98 すげー今更だけど、
>>70
あたりで定義してる get_line って、
きょうびのProlog処理系だとこんな感じでいいと思う
get_line(Line):-
findall(C,(
repeat,
get_char(C),
(C=='\r' -> fail
;C=='\n' -> !,fail
;true)
),Chars),
atom_chars(Line,Chars).
あんまり論理プログラミングっぽくはないが
>>70
あたりで定義してる get_line って、
きょうびのProlog処理系だとこんな感じでいいと思う
get_line(Line):-
findall(C,(
repeat,
get_char(C),
(C=='\r' -> fail
;C=='\n' -> !,fail
;true)
),Chars),
atom_chars(Line,Chars).
あんまり論理プログラミングっぽくはないが
265264
2011/10/06(木) 21:07:32.12 あと、ストリーム指定付きを作るなら、ストリーム指定付きを定義して、
ストリーム指定なしから呼び出すようにしたほうががスマート
get_line(Line):- current_input(Stream), get_line(Stream,Line).
get_line(Stream,Line):-
〜〜
get_char(Stream,C),
〜〜
current_input/1 が無ければ seeing/1 でも使うべし
ストリーム指定なしから呼び出すようにしたほうががスマート
get_line(Line):- current_input(Stream), get_line(Stream,Line).
get_line(Stream,Line):-
〜〜
get_char(Stream,C),
〜〜
current_input/1 が無ければ seeing/1 でも使うべし
266デフォルトの名無しさん
2011/10/07(金) 20:59:08.63 '\r'消しちゃうのはまずいような・・・
get_line(Line) :-
findall(C, (
repeat,
get_char(C),
(C = '\n', !, fail; true)), X),
(append(Y, ['\r'], X), !; Y = X), atom_chars(Line, Y).
get_line(Line) :-
findall(C, (
repeat,
get_char(C),
(C = '\n', !, fail; true)), X),
(append(Y, ['\r'], X), !; Y = X), atom_chars(Line, Y).
267264
2011/10/09(日) 21:23:06.10 >>266
標準入力かファイルからの入力で、一行読むとき、
キャリッジリターンが行中に出てくるシチュ、
それからもし出てきたとしてそれを生かしておく意味、
というのが想像つかないので、解説よろしくお願いしますっ
標準入力かファイルからの入力で、一行読むとき、
キャリッジリターンが行中に出てくるシチュ、
それからもし出てきたとしてそれを生かしておく意味、
というのが想像つかないので、解説よろしくお願いしますっ
268デフォルトの名無しさん
2011/10/10(月) 09:24:01.55 個人的に意味のない良いケースだから!って言って、
内容を勝手に改変しちゃうような処理に一般的な名前を付けちゃうのはどうかと思いますっ!
get_line_without_CRとでもしてはどうでしょうかっ
内容を勝手に改変しちゃうような処理に一般的な名前を付けちゃうのはどうかと思いますっ!
get_line_without_CRとでもしてはどうでしょうかっ
269デフォルトの名無しさん
2011/10/10(月) 11:24:47.45 >>268
ISO標準になっていないこのような定義は、どんなものを標準的なライブラリに
加えればよいか、まだ手探りの状態ですから、このような細かな点を議論する
ことに意義があると思います。できるだけ、細部を反映するような述語名を
与えるべしとするのは卓見だと思います。
ISO標準になっていないこのような定義は、どんなものを標準的なライブラリに
加えればよいか、まだ手探りの状態ですから、このような細かな点を議論する
ことに意義があると思います。できるだけ、細部を反映するような述語名を
与えるべしとするのは卓見だと思います。
270264
2011/10/10(月) 18:46:18.46 なんかノリが変だ・・・
本当に、何か見落としがあるなら教えて欲しかったし、
煽ったつもりはなかったんだけど
自分のコードは、>>73 で追加されたCR無視などを参考に、
書き方を変えただけのものなのだが、
ちゃんと 'end_of_file' を扱っていないとかアウトだ・・・ゴメン
もし入出力として一般化したいなら、
一文字入力の時に改行コードがどうなるかの標準に照らして書く、
の一点だと思う。
が、標準がある項目についても沿っていない処理系も多いPrologなので、
現状、挙動にあわせて処理を書くしかないのでは?
そうなると、単体CRを改行扱いした方がいい環境や、
単体LFを改行扱いしてはいけない環境もありそうだが
本当に、何か見落としがあるなら教えて欲しかったし、
煽ったつもりはなかったんだけど
自分のコードは、>>73 で追加されたCR無視などを参考に、
書き方を変えただけのものなのだが、
ちゃんと 'end_of_file' を扱っていないとかアウトだ・・・ゴメン
もし入出力として一般化したいなら、
一文字入力の時に改行コードがどうなるかの標準に照らして書く、
の一点だと思う。
が、標準がある項目についても沿っていない処理系も多いPrologなので、
現状、挙動にあわせて処理を書くしかないのでは?
そうなると、単体CRを改行扱いした方がいい環境や、
単体LFを改行扱いしてはいけない環境もありそうだが
271264
2011/10/10(月) 18:48:13.44 >どんなものを標準的なライブラリに加えればよいか
なんて議論の、末端にいる気持ちすらなかったし、
名前に拘りがある訳でももちろんなく、
get_line_without_CR は確かに実態に則した名前だと思うので、
そのような名前が必要な場合には各場で命名すればいいと思う。
ああ、必死だな、おれ
めっちゃ恥ずかしい
Prolog初心者スレって敷居高いな・・・
しばらくROMってます
なんて議論の、末端にいる気持ちすらなかったし、
名前に拘りがある訳でももちろんなく、
get_line_without_CR は確かに実態に則した名前だと思うので、
そのような名前が必要な場合には各場で命名すればいいと思う。
ああ、必死だな、おれ
めっちゃ恥ずかしい
Prolog初心者スレって敷居高いな・・・
しばらくROMってます
272264=270
2011/10/10(月) 18:57:55.89 ROMってるとか言ってさっそくだけど、一文抜けてたので。
>現状、挙動にあわせて処理を書くしかないのでは?
という段落の次に、
「だから俺自身は、実務上必要そうな実装の雛形の一提案をしたつもりでしかなかったので」
を挟んで、
>>どんなものを標準的なライブラリに加えればよいか
>なんて議論の、末端にいる気持ちすらなかったし、
に続くつもり。
なんだか意味のない煽りにしか見えなかったのが、
言い訳がましく見えるようになる一文を加えさせていただいて、さようなら
>現状、挙動にあわせて処理を書くしかないのでは?
という段落の次に、
「だから俺自身は、実務上必要そうな実装の雛形の一提案をしたつもりでしかなかったので」
を挟んで、
>>どんなものを標準的なライブラリに加えればよいか
>なんて議論の、末端にいる気持ちすらなかったし、
に続くつもり。
なんだか意味のない煽りにしか見えなかったのが、
言い訳がましく見えるようになる一文を加えさせていただいて、さようなら
273デフォルトの名無しさん
2011/10/12(水) 10:53:53.39 '\n'か'\r'か'\r\n'という問題は、環境にあまりに依存するから、現在のところ、改行は'\n'のみ、
'\r'は一応アルファベット扱いするしかないと思う。
なぜかというと、
?- ・・・concat_atom([_行1,_行2,_行3],_区切り文字,_ファイル全体の文字列),
というような処理は日常的に存在する。完全に復元するには、行に分解した際の
改行コードがなんであったかをファイルごとに出力モード引数で取得して
保存しておかなくてはならないが、これはあまりにも煩雑。
行の中に'\r'や'\n'を含めるのは実務的にさらに不可。ということになります。
'\r'は一応アルファベット扱いするしかないと思う。
なぜかというと、
?- ・・・concat_atom([_行1,_行2,_行3],_区切り文字,_ファイル全体の文字列),
というような処理は日常的に存在する。完全に復元するには、行に分解した際の
改行コードがなんであったかをファイルごとに出力モード引数で取得して
保存しておかなくてはならないが、これはあまりにも煩雑。
行の中に'\r'や'\n'を含めるのは実務的にさらに不可。ということになります。
274デフォルトの名無しさん
2011/10/18(火) 23:18:23.05 単純な好奇心なんだが、prologでクイックソートってどう書くの?
275デフォルトの名無しさん
2011/10/18(火) 23:39:33.53 Wikipediaのプログラム例にあるよ
276デフォルトの名無しさん
2011/10/19(水) 00:07:32.26 wikipediaとかしばらく見てなかった・・・
ありがとう
見てくる
ありがとう
見てくる
277デフォルトの名無しさん
2011/10/19(水) 00:24:36.08 haskellのリスト内包表記に相当する部分で複雑に見えてしまってますね・・・
(たぶん、リスト内包表記使わない方法だと同じくらいのコード量)
prologにはリスト内包表記に相当するものは無いのでしょうか?
(たぶん、リスト内包表記使わない方法だと同じくらいのコード量)
prologにはリスト内包表記に相当するものは無いのでしょうか?
findall使えばWikipediaのやつよりはHaskellっぽくなるかも(´・ω・`)こんな感じ
quicksort([], []).
quicksort([H|T], Sorted) :-
findall(E, (member(E, T), E @> H), GTs),
findall(E, (member(E, T), E @=< H), LEs),
quicksort(GTs, GTs2),
quicksort(LEs, LEs2),
append(LEs2, [H|GTs2], Sorted).
quicksort([], []).
quicksort([H|T], Sorted) :-
findall(E, (member(E, T), E @> H), GTs),
findall(E, (member(E, T), E @=< H), LEs),
quicksort(GTs, GTs2),
quicksort(LEs, LEs2),
append(LEs2, [H|GTs2], Sorted).
279デフォルトの名無しさん
2011/10/19(水) 06:47:22.49280デフォルトの名無しさん
2011/10/22(土) 13:46:29.58 ええー、どう見たって関数型言語のほうがコードがシンプルじゃん…
281デフォルトの名無しさん
2011/10/22(土) 14:02:35.00 >>280
partitionで分解する所がPrologの値打ちなんでね。
partitionで分解する所がPrologの値打ちなんでね。
282デフォルトの名無しさん
2011/10/22(土) 16:30:19.49283デフォルトの名無しさん
2011/10/22(土) 16:47:53.03284デフォルトの名無しさん
2011/10/22(土) 18:15:36.25285デフォルトの名無しさん
2011/10/22(土) 23:23:48.25 このfor/3を実装するのに、結構試行錯誤したわ
http://www.ifcomputer.com/IFProlog/Manuals/v4.1/reference/for/home_en.html
Prologって全然直感的じゃないな
http://www.ifcomputer.com/IFProlog/Manuals/v4.1/reference/for/home_en.html
Prologって全然直感的じゃないな
286デフォルトの名無しさん
2011/10/22(土) 23:51:13.94 >>285
これはC言語等の下劣な仕様に阿っているのが悪いのであって、
第二引数と第三引数を交換するだけで、
(分かりやすくするため 最終値 >= 初期値 のケースだけにする)
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式 > _最終値_式,!,fail.
for(_初期値_式,_最終値_式, _カウンタ) :-
_カウンタ is _初期値_式.
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式_2 is _初期値_式 + 1,
for(_初期値_式_2,_最終値_式, _カウンタ).
当たり前のPrologの述語となる。強いてちょっと
気持ち悪いのは第一節の !,fail. くらい。
これはC言語等の下劣な仕様に阿っているのが悪いのであって、
第二引数と第三引数を交換するだけで、
(分かりやすくするため 最終値 >= 初期値 のケースだけにする)
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式 > _最終値_式,!,fail.
for(_初期値_式,_最終値_式, _カウンタ) :-
_カウンタ is _初期値_式.
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式_2 is _初期値_式 + 1,
for(_初期値_式_2,_最終値_式, _カウンタ).
当たり前のPrologの述語となる。強いてちょっと
気持ち悪いのは第一節の !,fail. くらい。
287デフォルトの名無しさん
2011/10/22(土) 23:59:17.38288286
2011/10/23(日) 00:10:58.32 一般にPrologでは
foo(S,E,X) :- の形式をとり、
Sはカウンタ、X でそれを取り出す。
Eは限界値を示す。
これで数値カウンタループ述語を構成する。
for/3は
repeat.
repeat :- repeat.
のrepeatパターンの述語。
member/2やappend/3もこのパターン。
どれも非決定性述語である。
member(A,[A|_]).
member(A,[_|R]) :- member(A,R).
append([],L,L).
append([U|X],Y,[U|Z]) :- append(X,Y,Z).
?- append(_,_,_), ・・・ とするとrepeatと同じ機能となる。
(ただし繰り返しが多くなるとスタックオーバーフローが起きるかも知れない)
foo(S,E,X) :- の形式をとり、
Sはカウンタ、X でそれを取り出す。
Eは限界値を示す。
これで数値カウンタループ述語を構成する。
for/3は
repeat.
repeat :- repeat.
のrepeatパターンの述語。
member/2やappend/3もこのパターン。
どれも非決定性述語である。
member(A,[A|_]).
member(A,[_|R]) :- member(A,R).
append([],L,L).
append([U|X],Y,[U|Z]) :- append(X,Y,Z).
?- append(_,_,_), ・・・ とするとrepeatと同じ機能となる。
(ただし繰り返しが多くなるとスタックオーバーフローが起きるかも知れない)
290デフォルトの名無しさん
2011/10/23(日) 00:14:27.91 ありがちなミス
for(Lower,X,Upper) :-
Lower = X ; for(Lower+1,X,Upper).
for(Lower,X,Upper) :-
Lower = X ; for(Lower+1,X,Upper).
291デフォルトの名無しさん
2011/10/23(日) 00:19:43.74292デフォルトの名無しさん
2011/10/23(日) 00:30:08.03 >>291
立派なコードだと思うけど。
立派なコードだと思うけど。
293デフォルトの名無しさん
2011/10/23(日) 03:56:31.01294デフォルトの名無しさん
2011/10/23(日) 04:32:16.76 >>293
ここでやってるforはCやJavaのforとは無関係で、Haskellの[from..to]みたいなもの。
処理は、
for(L,X,H), do(X,C).
みたいに書いて、最後にfailさせるかメタ述語で全解生成する。
Haskellなら[ do x | x <- [from..to]]だね。
ここでやってるforはCやJavaのforとは無関係で、Haskellの[from..to]みたいなもの。
処理は、
for(L,X,H), do(X,C).
みたいに書いて、最後にfailさせるかメタ述語で全解生成する。
Haskellなら[ do x | x <- [from..to]]だね。
295デフォルトの名無しさん
2011/10/23(日) 04:51:07.54296デフォルトの名無しさん
2011/10/23(日) 07:21:02.39 >>293
数値を順に生成するもの。
?- for(1,N,3),write(a),N=3.
aaa
?- for(1,N,3),write(a),fail.
aaa
false
?- for(1,N,3),M is N * 2,write(M),nl,N=3.
2
4
6
?- for(1,N,3),M is N * 2,write(M),nl.
2
N = 1,
M = 2;
4
N = 2,
M = 4;
6
N = 3,
M = 6;
false
% findall/3と併用。組合せや順列の処理の時しばしば使う。
?- findall(N,for(1,N,10),L).
L = [1,2,3,4,5,6,7,8,9,10]
数値を順に生成するもの。
?- for(1,N,3),write(a),N=3.
aaa
?- for(1,N,3),write(a),fail.
aaa
false
?- for(1,N,3),M is N * 2,write(M),nl,N=3.
2
4
6
?- for(1,N,3),M is N * 2,write(M),nl.
2
N = 1,
M = 2;
4
N = 2,
M = 4;
6
N = 3,
M = 6;
false
% findall/3と併用。組合せや順列の処理の時しばしば使う。
?- findall(N,for(1,N,10),L).
L = [1,2,3,4,5,6,7,8,9,10]
297デフォルトの名無しさん
2011/10/23(日) 11:25:08.28 >>296
ふーむ・・・
数列をただ生成してるだけだけど、Prologだといろんな使い方がある訳か・・・
Haskellだと数列リスト作って後から加工する形かな?
for n m _ | m n == False = []
for n m s = n: for (s n) m s
使用例
*Main> mapM (print.(*2)) (for 1 (<=3) (1+))
2
4
6
[(),(),()]
確かに、>>294の言うとおり、リスト内包表記使う方が自然だね
for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
使用例
*Main> for 1 (<=) 3 (1+)
[1,2,3]
prologの方が、手続き型のforに使い方が近くなるのか
ふーむ・・・
数列をただ生成してるだけだけど、Prologだといろんな使い方がある訳か・・・
Haskellだと数列リスト作って後から加工する形かな?
for n m _ | m n == False = []
for n m s = n: for (s n) m s
使用例
*Main> mapM (print.(*2)) (for 1 (<=3) (1+))
2
4
6
[(),(),()]
確かに、>>294の言うとおり、リスト内包表記使う方が自然だね
for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
使用例
*Main> for 1 (<=) 3 (1+)
[1,2,3]
prologの方が、手続き型のforに使い方が近くなるのか
298デフォルトの名無しさん
2011/10/23(日) 11:27:36.00 あう・・・
>for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
の"fn"は無視して・・・
>for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
の"fn"は無視して・・・
299286
2011/10/24(月) 08:20:39.22 >これはC言語等の下劣な仕様に阿っているのが悪いのであって
は適切な書き込みでありませんでした。恐縮ですが、無いことにしてください。
は適切な書き込みでありませんでした。恐縮ですが、無いことにしてください。
300デフォルトの名無しさん
2011/10/24(月) 16:05:09.28 >>293
for/3の典型的な使い方。 findall/3 の中で使う。
ふたつ取り出す(_リスト,_一つ目,_二つ目) :-
length(_リスト,_リストの長さ),
findall(N,for(1,N,_リストの長さ),L),
順列(L,2,[M,N]),
nth1(M,_リスト,_一つ目),
nth1(N,_リスト,_二つ目).
?- ふたつ取り出す([赤,青,緑],_一つ目,_二つ目).
_一つ目 = '赤',
_二つ目 = '青';
_一つ目 = '赤',
_二つ目 = '緑';
_一つ目 = '青',
_二つ目 = '赤';
_一つ目 = '青',
_二つ目 = '緑';
_一つ目 = '緑',
_二つ目 = '赤';
_一つ目 = '緑',
_二つ目 = '青';
false
for/3の典型的な使い方。 findall/3 の中で使う。
ふたつ取り出す(_リスト,_一つ目,_二つ目) :-
length(_リスト,_リストの長さ),
findall(N,for(1,N,_リストの長さ),L),
順列(L,2,[M,N]),
nth1(M,_リスト,_一つ目),
nth1(N,_リスト,_二つ目).
?- ふたつ取り出す([赤,青,緑],_一つ目,_二つ目).
_一つ目 = '赤',
_二つ目 = '青';
_一つ目 = '赤',
_二つ目 = '緑';
_一つ目 = '青',
_二つ目 = '赤';
_一つ目 = '青',
_二つ目 = '緑';
_一つ目 = '緑',
_二つ目 = '赤';
_一つ目 = '緑',
_二つ目 = '青';
false
301デフォルトの名無しさん
2011/10/24(月) 19:07:03.79 >>300
ご存知かもしれませんが、select/3を使うと、もっとシンプルに書けますよ。
choice2(L, E1, E2) :- select(E1, L, L1), select(E2, L1, _).
ご存知かもしれませんが、select/3を使うと、もっとシンプルに書けますよ。
choice2(L, E1, E2) :- select(E1, L, L1), select(E2, L1, _).
302デフォルトの名無しさん
2011/10/24(月) 21:04:25.60303302
2011/10/24(月) 21:07:52.52 ガウス行列の述語群は間違っているところがあって、
正しく実行されません。forの使い方の例として見るためのものとしてください。
正しく実行されません。forの使い方の例として見るためのものとしてください。
304デフォルトの名無しさん
2011/10/26(水) 14:30:19.35305デフォルトの名無しさん
2011/10/26(水) 17:32:24.68306デフォルトの名無しさん
2011/10/27(木) 20:03:54.30 >>302
ページ内索引を設けるなどして、参照しやすく作られていると助かります。
ページ内索引を設けるなどして、参照しやすく作られていると助かります。
307デフォルトの名無しさん
2011/10/27(木) 20:45:58.35 >>306
順不同の2300題のうち約300題を抜き取ったもので、どんな索引を
作るかなど、課題山積ですね。for/3述語から始まるループに名前が
付けられれば、索引は作りやすい。for/3は最も名前を与えにくい述語
ですが、これに限らず部分計算のかけらに適切な名前を与えることが
現在のそしてこれからのテーマです。
順不同の2300題のうち約300題を抜き取ったもので、どんな索引を
作るかなど、課題山積ですね。for/3述語から始まるループに名前が
付けられれば、索引は作りやすい。for/3は最も名前を与えにくい述語
ですが、これに限らず部分計算のかけらに適切な名前を与えることが
現在のそしてこれからのテーマです。
308デフォルトの名無しさん
2011/10/27(木) 20:52:43.37 順不同ではなくて、何の順序付けもされていない2300題から約300題
前の方から抜き取っただけで・・・ ですね。
前の方から抜き取っただけで・・・ ですね。
309デフォルトの名無しさん
2011/10/27(木) 20:56:56.62310デフォルトの名無しさん
2011/10/27(木) 21:03:23.89 仕上げのイメージは既にあって、
「英語活用大辞典」と「囲碁定石大辞典」という2つのタイプ、機能のミックスです。
1) ある述語の具体的な定義節を参照可能で
2) できるだけ多くの、出来れば公開(出版)された全てのProlog述語の定義節が網羅されて、
3) 一つのテーマ、課題をもとに詳細な変化譜を展開する
使う人がいるかどうか疑問ですが、私一代では仕上がりません。
「英語活用大辞典」と「囲碁定石大辞典」という2つのタイプ、機能のミックスです。
1) ある述語の具体的な定義節を参照可能で
2) できるだけ多くの、出来れば公開(出版)された全てのProlog述語の定義節が網羅されて、
3) 一つのテーマ、課題をもとに詳細な変化譜を展開する
使う人がいるかどうか疑問ですが、私一代では仕上がりません。
311デフォルトの名無しさん
2011/10/27(木) 21:17:24.15 >>309
それぞれに読んだ人が部分部分にコメントをつけたり誤りを指摘したり
できるから、おもしろい利用法かも知れませんね。# から始まる課題の
コピーの他に要約を付けていけばいい。ただし、私は医者や紺屋ほど
専門家ではないけど、ブログって実は使ったことがない。作ったことも。
それぞれに読んだ人が部分部分にコメントをつけたり誤りを指摘したり
できるから、おもしろい利用法かも知れませんね。# から始まる課題の
コピーの他に要約を付けていけばいい。ただし、私は医者や紺屋ほど
専門家ではないけど、ブログって実は使ったことがない。作ったことも。
312デフォルトの名無しさん
2011/10/28(金) 12:11:43.15 最近のは定石大事典かな。
以前は定石大辞典だった気がする。瀬越憲作名誉九段の監修。
以前は定石大辞典だった気がする。瀬越憲作名誉九段の監修。
313デフォルトの名無しさん
2011/10/28(金) 18:22:41.97 twitterへのPrologに関する日本語の書き込みがここのところ約一ヶ月
24時間で15~20ツイートを常に維持している。
4-5月ころは3~5平均だったから、相当の増加。外国語のツイートはさらに
爆発的で5倍どころではない。
24時間で15~20ツイートを常に維持している。
4-5月ころは3~5平均だったから、相当の増加。外国語のツイートはさらに
爆発的で5倍どころではない。
314デフォルトの名無しさん
2011/10/28(金) 18:28:01.50 なんかあったの?
315デフォルトの名無しさん
2011/10/28(金) 18:53:04.11 >>314
8月から「7つの言語 7つの世界」の影響で2倍以上の書き込みになった。
外国の事情は、よく判らないけど、似たようなことが起こっているようだ。
9月後半からの急増は相乗効果ではないか。過去の遺物といった否定的な
先入観による書き込みはほとんどなくなり、面白いという書き込みが突然
増えた。
8月から「7つの言語 7つの世界」の影響で2倍以上の書き込みになった。
外国の事情は、よく判らないけど、似たようなことが起こっているようだ。
9月後半からの急増は相乗効果ではないか。過去の遺物といった否定的な
先入観による書き込みはほとんどなくなり、面白いという書き込みが突然
増えた。
316デフォルトの名無しさん
2011/10/28(金) 19:00:13.44 難しい。わからないも多いな。
317デフォルトの名無しさん
2011/10/28(金) 19:35:17.42 よく分からんが、関数型言語への注目が集まった波及効果によって、
宣言型言語の一つである論理型言語(Prolog)にも関心が増えたのではないかと推測
あとはCoqのような実用的な定理証明系が登場して一般人向けの情報が増えた
(実用的といっても....だし、一般人といっても.....だけどね)
その結果として「論理とプログラミングとの関係」について考える人が増えたのかも
物事を形式的にモデル化するには関数だけでは足りなくて、論理も必要になるから
宣言型言語の一つである論理型言語(Prolog)にも関心が増えたのではないかと推測
あとはCoqのような実用的な定理証明系が登場して一般人向けの情報が増えた
(実用的といっても....だし、一般人といっても.....だけどね)
その結果として「論理とプログラミングとの関係」について考える人が増えたのかも
物事を形式的にモデル化するには関数だけでは足りなくて、論理も必要になるから
318デフォルトの名無しさん
2011/10/28(金) 20:06:42.91319デフォルトの名無しさん
2011/10/28(金) 20:57:19.14 そこでCurryですよ
320デフォルトの名無しさん
2011/10/28(金) 21:08:44.19 第五世代のころは世間的にはどんな扱いだったんだろう?
銀の弾丸みたいだったのかな
銀の弾丸みたいだったのかな
321デフォルトの名無しさん
2011/10/28(金) 21:28:30.72 >>320
過大評価されたし、バブル期でもあった。
Prologプログラマを派遣してもらうにはひとり120万/月とか。
ナレッジエンジニアの必須技術とされた。実はプログラマ数は
あまり増えなかったが、一応メジャー言語の末席。bit誌などの
広告ではProlog処理系が他を圧倒していた。
企業がPrologを見限って、C++に移行して急速に衰退した。
PrologでやりかたったことをC++でできるというわけではなく、
AI技術発展のお裾分けにあずかるという目論見はその時点で
挫折。
過大評価されたし、バブル期でもあった。
Prologプログラマを派遣してもらうにはひとり120万/月とか。
ナレッジエンジニアの必須技術とされた。実はプログラマ数は
あまり増えなかったが、一応メジャー言語の末席。bit誌などの
広告ではProlog処理系が他を圧倒していた。
企業がPrologを見限って、C++に移行して急速に衰退した。
PrologでやりかたったことをC++でできるというわけではなく、
AI技術発展のお裾分けにあずかるという目論見はその時点で
挫折。
322デフォルトの名無しさん
2011/10/28(金) 23:41:01.71 民主党が与党から転落するシナリオのパターンをPrologを求めて
323デフォルトの名無しさん
2011/10/29(土) 00:26:01.26 swi-prologのインタプリタをコマンドプロンプト内で実行させることはできませんか?
324デフォルトの名無しさん
2011/10/29(土) 00:29:29.96 UNIXなら swipl でインタプリタが対話モードで起動するけど....
325デフォルトの名無しさん
2011/10/29(土) 00:36:42.49326デフォルトの名無しさん
2011/10/29(土) 05:14:40.59 そういやちょっと前までplconだったよね
再インストールしたらswiplに変わってて焦った;;
再インストールしたらswiplに変わってて焦った;;
327デフォルトの名無しさん
2011/10/29(土) 13:00:09.12 http://nojiriko.asia/prolog/findmax.html
のmax/2の実装を見て、もっと簡潔に書けそうな気がしたのでチャレンジしてみました。
% max_list(_リスト, _リストの中の最大値).
max_list([_唯一の要素], _唯一の要素) :- !.
max_list([_先頭要素 | _残りのリスト], _最大値) :-
max_list(_残りのリスト, _残りのリストの最大値),
(_先頭要素 @> _残りのリストの最大値 ->
_最大値 = _先頭要素 ;
_最大値 = _残りのリストの最大値).
accumulatorを使うか使わないかの違いしかないですね…
のmax/2の実装を見て、もっと簡潔に書けそうな気がしたのでチャレンジしてみました。
% max_list(_リスト, _リストの中の最大値).
max_list([_唯一の要素], _唯一の要素) :- !.
max_list([_先頭要素 | _残りのリスト], _最大値) :-
max_list(_残りのリスト, _残りのリストの最大値),
(_先頭要素 @> _残りのリストの最大値 ->
_最大値 = _先頭要素 ;
_最大値 = _残りのリストの最大値).
accumulatorを使うか使わないかの違いしかないですね…
328デフォルトの名無しさん
2011/10/29(土) 13:02:51.49 ?- max_list([1, 30, X, 75], X).
X = 75.
ん?これでいいのか…?
X = 75.
ん?これでいいのか…?
329デフォルトの名無しさん
2011/10/29(土) 13:37:42.77 >>328
Prologの代入(単一化)とは、そういうものじゃないかと思われ
Prologの代入(単一化)とは、そういうものじゃないかと思われ
330デフォルトの名無しさん
2011/10/29(土) 14:25:17.01 >>327
要素位置番号も要求されているので一引数増えていますが、
http://nojiriko.asia/prolog/c152_883.html
の方が普通の最大値述語に近いと思います。四通り作って見ました。
要素位置番号も要求されているので一引数増えていますが、
http://nojiriko.asia/prolog/c152_883.html
の方が普通の最大値述語に近いと思います。四通り作って見ました。
331330
2011/10/29(土) 14:26:44.60 あ、5通りでした。
332デフォルトの名無しさん
2011/10/30(日) 00:29:44.58 functor/3や=..は何かに使えそうだけど、使いどころがイマイチ分からない
>>332
Lispのマクロ的な使い方や、Prologの項データを別の形式で出力する時などに便利そうですね〜
X is 2 + 3,
Y is 6 + X * 3,
write(6 + 5 * 3 = 6 + Y * 3).
Prologはこのようにちょっとした計算でも、
ゴール間の値の橋渡しの為の変数を沢山使いますよね
そこで、これを↓のようにゴール中に別のゴールを直接記述するマクロを=..で作ってみました
func_style(write(6 + 5 * 3 = ^is(**, 6 + ^is(**, 2 + 3) * 3)), X),
X.
https://gist.github.com/1325544
Lispのマクロ的な使い方や、Prologの項データを別の形式で出力する時などに便利そうですね〜
X is 2 + 3,
Y is 6 + X * 3,
write(6 + 5 * 3 = 6 + Y * 3).
Prologはこのようにちょっとした計算でも、
ゴール間の値の橋渡しの為の変数を沢山使いますよね
そこで、これを↓のようにゴール中に別のゴールを直接記述するマクロを=..で作ってみました
func_style(write(6 + 5 * 3 = ^is(**, 6 + ^is(**, 2 + 3) * 3)), X),
X.
https://gist.github.com/1325544
334デフォルトの名無しさん
2011/10/31(月) 00:52:16.75 で、prologで何ができるの?
335デフォルトの名無しさん
2011/10/31(月) 05:02:43.89336デフォルトの名無しさん
2011/10/31(月) 14:43:54.61 >>335
事務処理のバッチ処理でデータベースアクセス時間+Prologの演算時間として
後者にどれくらい許されるかということだろう。1時間だと2000万トランザクション
3時間だと5000万は超えるから、一部上場企業の95%以上クリアできると思うけど。
事務処理のバッチ処理でデータベースアクセス時間+Prologの演算時間として
後者にどれくらい許されるかということだろう。1時間だと2000万トランザクション
3時間だと5000万は超えるから、一部上場企業の95%以上クリアできると思うけど。
337デフォルトの名無しさん
2011/10/31(月) 21:47:52.41 ゲームとかも作れるの?
prologからwin32apiとかdirectxとかで画像表示もできる?
prologからwin32apiとかdirectxとかで画像表示もできる?
338デフォルトの名無しさん
2011/10/31(月) 22:47:34.81 >>337
Visual Prolog という製品(昔BorlandのTurbo Prologといった)上で開発された
ゲームというのは見たことがあるけど、激しく画面が動いていた記憶以外、ゲームには
関心がないからどういう種類のものかわからないし内容も覚えていない。
他の処理系もそれぞれグラフィックインターフェイスを謳っているようだけれど、
ゲームに適したものかどうかは知らない。
Visual Prolog という製品(昔BorlandのTurbo Prologといった)上で開発された
ゲームというのは見たことがあるけど、激しく画面が動いていた記憶以外、ゲームには
関心がないからどういう種類のものかわからないし内容も覚えていない。
他の処理系もそれぞれグラフィックインターフェイスを謳っているようだけれど、
ゲームに適したものかどうかは知らない。
339338
2011/10/31(月) 22:52:56.59 3D的な部分を計算する必要があるとすると、現在のProlog処理系では
時間がかかり過ぎて動かないはずだから、そういうことはしていないか、
別のからくりがあるのだと思う。
時間がかかり過ぎて動かないはずだから、そういうことはしていないか、
別のからくりがあるのだと思う。
340デフォルトの名無しさん
2011/11/09(水) 21:59:04.10 prologで前向き推論は出来るの?
341デフォルトの名無しさん
2011/11/09(水) 23:01:40.86 >>340
累算器を使えば可能
累算器を使えば可能
342デフォルトの名無しさん
2011/11/14(月) 05:29:23.97 TIOBE INDEX NOVEMBER http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Prologは急伸。10月は0.288 だったのが 0.353
23%上昇し、一気にHaskellを追い抜いた。
Prologは急伸。10月は0.288 だったのが 0.353
23%上昇し、一気にHaskellを追い抜いた。
343デフォルトの名無しさん
2011/11/14(月) 06:51:58.56344デフォルトの名無しさん
2011/11/14(月) 06:59:23.04 このぺースでいくと、一年位で本来の実力、0.45% 25-30位までは戻る。
そうはいかないけどねw
そうはいかないけどねw
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.59373369
2011/12/11(日) 09:17:01.68 member/2を外してfindallの第二引数を定義し直してみましょう。
like368(List,NewList) :-
findall(N,add_1(List,N),NewList).
add_1([N1|_],N) :- N is N1 + 1.
add_1([_|R],N) :-
add_1(R,N).
しかし、こうなるとlike368の再帰による定義は
like368([],[]).
like368([N1|R1],[N2|R2]) :-
N2 is N1 + 1,
like368(R1,R2).
ですから、何をやってるのかわからない、ということにもなる。
つまり、何故findallによる定義を使うかですが、
memberやappendといった既存の高名な非決定性の再帰述語!!を
使ってadd_1のような定義を省略します。こうすることによって再帰定義の
繰り返しをひとつ回避してほんの僅かですが宣言性を高めようと
しているのです。
like368(List,NewList) :-
findall(N,add_1(List,N),NewList).
add_1([N1|_],N) :- N is N1 + 1.
add_1([_|R],N) :-
add_1(R,N).
しかし、こうなるとlike368の再帰による定義は
like368([],[]).
like368([N1|R1],[N2|R2]) :-
N2 is N1 + 1,
like368(R1,R2).
ですから、何をやってるのかわからない、ということにもなる。
つまり、何故findallによる定義を使うかですが、
memberやappendといった既存の高名な非決定性の再帰述語!!を
使ってadd_1のような定義を省略します。こうすることによって再帰定義の
繰り返しをひとつ回避してほんの僅かですが宣言性を高めようと
しているのです。
374デフォルトの名無しさん
2011/12/11(日) 09:43:08.70 >>373
そうではないと思う。add_1/2が非決定性の述語と定義されているから
あるいは、定義することに決めたから、findall/3が必然になったのだ。
データ構造の設計で、リストからリストへと展開することを基本とする
なら、再帰述語中心の定義になるだろうし、
Prologの基本はデータベース述語(単位節)であって本質的に非決定性で
あることは避けられないという立場からの設計なら、集約述語である
findall/3の使用は必須のものとなる。
宣言性の強弱は確かにあるが些細な差であって、より重要なことはこの
ような設計上の差異である。
そうではないと思う。add_1/2が非決定性の述語と定義されているから
あるいは、定義することに決めたから、findall/3が必然になったのだ。
データ構造の設計で、リストからリストへと展開することを基本とする
なら、再帰述語中心の定義になるだろうし、
Prologの基本はデータベース述語(単位節)であって本質的に非決定性で
あることは避けられないという立場からの設計なら、集約述語である
findall/3の使用は必須のものとなる。
宣言性の強弱は確かにあるが些細な差であって、より重要なことはこの
ような設計上の差異である。
375デフォルトの名無しさん
2011/12/11(日) 11:34:15.70 prologは非決定性を持つといえるのか?
非決定性というが、prologの場合、結果は順序まで含めて決定的。
この点ではSQLはまだ非決定性を持つが、結果を集合として考えるならやはり
決定的かな。
それと、単位節は要するに表でRDBと同じ。
その意味では、prologをprologたらしめているのは、単位節以外にあるといえる。
非決定性というが、prologの場合、結果は順序まで含めて決定的。
この点ではSQLはまだ非決定性を持つが、結果を集合として考えるならやはり
決定的かな。
それと、単位節は要するに表でRDBと同じ。
その意味では、prologをprologたらしめているのは、単位節以外にあるといえる。
376デフォルトの名無しさん
2011/12/11(日) 13:05:16.05 例えばAとBとCという概念があって,これら単体ではPrologの本質とは言えないが,
これらの概念の組み合わせ方が本質だったりする場合があるので,
そういう場合は、AやBやCという概念を持ついろんなモノをまとめて表にしていくとぼんやりと見えてくる.
メンデレーエフが周期表を発見したときのように.
これらの概念の組み合わせ方が本質だったりする場合があるので,
そういう場合は、AやBやCという概念を持ついろんなモノをまとめて表にしていくとぼんやりと見えてくる.
メンデレーエフが周期表を発見したときのように.
377デフォルトの名無しさん
2011/12/11(日) 17:39:13.48 >>375
Prologは非決定性モデルを、仕様の表に出さない決定的プロセスによって実装している
この立場に立つ人は、Prologでは、解の出現順序が決定的でなければ困るような問題を扱ってはならない
これの一番の利点はモデルを考えるとき(つまり論文を書くとき)に解を普通の集合として取り扱えること
逆に言うと、Prologの実装の決定性に依存するような問題を考えるときにはPrologの利点はなくなり、かえって実装が複雑になる
(もちろん、どんな問題であれ、解を効率的に見つけるというアルゴリズムを考えるときにはPrologの決定的な側面を厳密に考慮しなくてはならない)
Prologは非決定性モデルを、仕様の表に出さない決定的プロセスによって実装している
この立場に立つ人は、Prologでは、解の出現順序が決定的でなければ困るような問題を扱ってはならない
これの一番の利点はモデルを考えるとき(つまり論文を書くとき)に解を普通の集合として取り扱えること
逆に言うと、Prologの実装の決定性に依存するような問題を考えるときにはPrologの利点はなくなり、かえって実装が複雑になる
(もちろん、どんな問題であれ、解を効率的に見つけるというアルゴリズムを考えるときにはPrologの決定的な側面を厳密に考慮しなくてはならない)
378デフォルトの名無しさん
2011/12/11(日) 20:01:37.69 prologの言語仕様は、解の出現順序を決定的に定義してたと思う。
ISOの規格文書が見つからないので引用できないけど。
ISOの規格文書が見つからないので引用できないけど。
379デフォルトの名無しさん
2011/12/11(日) 20:13:59.14 ISOのWebサイトは見づらすぎるね
こちとらAdobe Readerなんてはいってないんだよ
こちとらAdobe Readerなんてはいってないんだよ
380379
2011/12/11(日) 20:15:03.51 ごめん入出力はISOなのに脳みそはJISと認識してたわ
381デフォルトの名無しさん
2011/12/12(月) 06:57:02.61 >>375
Prologの単位節はもうこれ以上、書き換えることのない、どん詰まりの情報だ。
中島秀之氏はこれをプリミティブなものと表現したが。
RDBは列ごとに集合を表すが、Prologの単位節の引数にそういった意味合いは
まったくない。あくまでRDBに模して(RDBとの親和性といった)、引数部分に情報
を配置することが可能というだけ。
Prologのプログラムとはこのどん詰まりに導くためにルールが書かれていると
解釈できるのであって、どちらがPrologの根幹かなどと問うこと自体無意味だ。
Prologの単位節はもうこれ以上、書き換えることのない、どん詰まりの情報だ。
中島秀之氏はこれをプリミティブなものと表現したが。
RDBは列ごとに集合を表すが、Prologの単位節の引数にそういった意味合いは
まったくない。あくまでRDBに模して(RDBとの親和性といった)、引数部分に情報
を配置することが可能というだけ。
Prologのプログラムとはこのどん詰まりに導くためにルールが書かれていると
解釈できるのであって、どちらがPrologの根幹かなどと問うこと自体無意味だ。
382デフォルトの名無しさん
2011/12/12(月) 07:03:09.67 RDBの正規化もどん詰まりの情報では?
意味合いを持たせる持たせないの話なら使い手次第では?
意味合いを持たせる持たせないの話なら使い手次第では?
383デフォルトの名無しさん
2011/12/12(月) 07:26:04.30384デフォルトの名無しさん
2011/12/12(月) 07:43:31.73 >>381
どちらにというとそうだけど、帰納論理プログラミングなんかは、
明らかに具体的な情報を基礎にルールを見つけて組み立てるという
方向のアプローチですね。そういう方向性のようなものは個々の
Prologプログラマの中にもあるということではないか。Prologを
証明器として捉える人は、ルール重視になるだろうし。
どちらにというとそうだけど、帰納論理プログラミングなんかは、
明らかに具体的な情報を基礎にルールを見つけて組み立てるという
方向のアプローチですね。そういう方向性のようなものは個々の
Prologプログラマの中にもあるということではないか。Prologを
証明器として捉える人は、ルール重視になるだろうし。
385デフォルトの名無しさん
2011/12/12(月) 08:13:19.07 prologをデータベース代わりに使う人は
単位節を主として、ルールを副と考えるよね。
このスレには昔から「prologの根幹は単位節」と唱える人がいるみたいだし。
それはprologの、ではなくデータベースの根幹だといつも思う。
単位節を主として、ルールを副と考えるよね。
このスレには昔から「prologの根幹は単位節」と唱える人がいるみたいだし。
それはprologの、ではなくデータベースの根幹だといつも思う。
386デフォルトの名無しさん
2011/12/12(月) 08:55:46.872011/12/12(月) 09:01:39.56
>>386
ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。
ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。
389デフォルトの名無しさん
2011/12/12(月) 09:28:02.13 内包と外延が近い表記法でバランスよくプログラムに記述できる
ところがPrologの大きな魅力だ、というくらいでいいんじゃないか。
ところがPrologの大きな魅力だ、というくらいでいいんじゃないか。
390デフォルトの名無しさん
2011/12/12(月) 12:59:25.07 よく分からない。
ボディがtrueのルールがファクトなのでしょう?
ルールはファクトを包含しているのでしょう?
なら節は全てルールだけと言えるでしょう?
仮にファクトだけで成立するならそれは命題論理であって、一階述語論理ではない、つまりPrologではない。
ボディがtrueのルールがファクトなのでしょう?
ルールはファクトを包含しているのでしょう?
なら節は全てルールだけと言えるでしょう?
仮にファクトだけで成立するならそれは命題論理であって、一階述語論理ではない、つまりPrologではない。
391デフォルトの名無しさん
2011/12/12(月) 16:09:09.71392デフォルトの名無しさん
2011/12/12(月) 16:33:00.97 >>375
棄て去った解候補の順序が決まっているかどうかなんて関係あるかな。
棄て去った解候補の順序が決まっているかどうかなんて関係あるかな。
393デフォルトの名無しさん
2011/12/14(水) 15:55:43.43 Prolog Cafe 1.2.5で
| ?- frend(taro,hanako).
{EXISTENCE ERROR: procedure frend/2 does not exist}
| ?-
などといわれます。このエラーは何ですか?
| ?- frend(taro,hanako).
{EXISTENCE ERROR: procedure frend/2 does not exist}
| ?-
などといわれます。このエラーは何ですか?
394デフォルトの名無しさん
2011/12/14(水) 19:29:31.30 >>393
節データベースにfriend/2が存在しないという意味。
assert(frend(taro,hanako)).
と入力すれば節データベースに追加される。
確認するには、
listing.
と入力する。
assertせずにソースファイルから節データベースに読み込む場合は、
['hogehoge.pl'].
と入力する。
節データベースにfriend/2が存在しないという意味。
assert(frend(taro,hanako)).
と入力すれば節データベースに追加される。
確認するには、
listing.
と入力する。
assertせずにソースファイルから節データベースに読み込む場合は、
['hogehoge.pl'].
と入力する。
395デフォルトの名無しさん
2011/12/15(木) 07:59:20.08396デフォルトの名無しさん
2011/12/21(水) 11:28:06.93 データが基礎であり、則ちデータベースが基礎である。 そのデータベースを最も自然体で保持できるプログラム言語は Prologである。これだけで十分で、特に単位節がPrologの基本 などと云う必要もない。
397デフォルトの名無しさん
2011/12/23(金) 00:30:36.61 Prologは関係データベースと演繹データベースの派生として解釈できる
しかし、Prologはデータベースが基礎であるというのは言い過ぎ
理由は、永続的に記録できるデータはソースファイルに書いた分だけで、稼働中に追加されたデータはただちに消えるか、Prologの仕様にない方法で記録するしかないから
Prologをデータベースというのなら、C言語もデータベースということになる
C言語の方はさらに表現能力が高い演繹データベースということになる
しかし、Prologはデータベースが基礎であるというのは言い過ぎ
理由は、永続的に記録できるデータはソースファイルに書いた分だけで、稼働中に追加されたデータはただちに消えるか、Prologの仕様にない方法で記録するしかないから
Prologをデータベースというのなら、C言語もデータベースということになる
C言語の方はさらに表現能力が高い演繹データベースということになる
398デフォルトの名無しさん
2011/12/23(金) 05:14:48.50 >>397
Prologをオンメモリデータベースシステムとして捉えたら欠点だらけと
いうことになる。ここでも指摘されているが、assertzが無闇と遅く、
初期状態の回復に時間がかかる。節順序を指定してのUPDATEが
できない、等。しかし、現実にはそれを補強しながら使われている。
Prologのデータベースや単位節を強調した話題は、全部態度表明。
オブジェクト指向の初期に差分プログラミングが強調されたようなレベル。
Prologをオンメモリデータベースシステムとして捉えたら欠点だらけと
いうことになる。ここでも指摘されているが、assertzが無闇と遅く、
初期状態の回復に時間がかかる。節順序を指定してのUPDATEが
できない、等。しかし、現実にはそれを補強しながら使われている。
Prologのデータベースや単位節を強調した話題は、全部態度表明。
オブジェクト指向の初期に差分プログラミングが強調されたようなレベル。
399デフォルトの名無しさん
2011/12/23(金) 07:12:56.08 >>397 Prologデータベースについては、単一レベル記憶的なイメージの 実現を夢見るのが一番ハッピーなのではないか。あまり永続性に 拘るのもいかがなものか。その昔、コアメモリなんてものもあった。
400デフォルトの名無しさん
2011/12/23(金) 16:21:20.36 停電したらどうしようという話でしょ。
401デフォルトの名無しさん
2011/12/23(金) 16:27:24.34 なんか話がループしてるような気がする。
暇なひとはマインドマップでも書いて見ると良い。
もちえん枝葉にはそれぞれ議論があるだろからきれいな図にはならず、
きっと面倒だろう。
暇なひとはマインドマップでも書いて見ると良い。
もちえん枝葉にはそれぞれ議論があるだろからきれいな図にはならず、
きっと面倒だろう。
402デフォルトの名無しさん
2011/12/23(金) 17:15:31.47 >>400
データベースとして使う時はPrologサーバーとして使うから、
トランザクションの度に子プロセスを生成して、そこにコピーが
できるわけだから、保存ファイルにlistingするのではないかな。
データベースとして使う時はPrologサーバーとして使うから、
トランザクションの度に子プロセスを生成して、そこにコピーが
できるわけだから、保存ファイルにlistingするのではないかな。
403デフォルトの名無しさん
2011/12/24(土) 14:13:21.25 Prologをデータベースとしてとらえたときに、特に優れている点は、複数の関係のJoinしたときのパターンマッチングの速度の速さ
特に劣っている点がデータの更新と永続性
特に劣っている点がデータの更新と永続性
404デフォルトの名無しさん
2011/12/24(土) 17:32:27.27 節の定義順を維持しようとすると、全ての節を一度retractしなくては
ならない。ここらあたりの基本動作は改変しないと本格的なデータベースには
使えない。
最低限、節の定義位置の相対番号によりretract/assert指定は可能にする
必要がある。
ならない。ここらあたりの基本動作は改変しないと本格的なデータベースには
使えない。
最低限、節の定義位置の相対番号によりretract/assert指定は可能にする
必要がある。
405デフォルトの名無しさん
2011/12/24(土) 17:39:41.47 それから、永続性の問題の方は、オンメモリデータベース共通の問題だが、
停止したあとの再現が確実に行われる必要がある。現在はこれに使用する
ユーティリティの作成から全てをエンドユーザ任せの水準だが、Prolog処理系が
安全で安定した動作/環境を保証する必要がある。
停止したあとの再現が確実に行われる必要がある。現在はこれに使用する
ユーティリティの作成から全てをエンドユーザ任せの水準だが、Prolog処理系が
安全で安定した動作/環境を保証する必要がある。
406デフォルトの名無しさん
2011/12/24(土) 22:41:14.94407デフォルトの名無しさん
2011/12/25(日) 00:47:56.96 >>406
正確には、演繹データベースの中ではPrologはボディ部のマッチングが特に速く、適切なホーン説が存在すればあればJoinが関係データベースよりも速くなる
r(X,Y) and s(Y,Z) and t(Z)
という結合を考えるとき、Oracleみたいな関係データベースは、rとsとtの全タプルの全組み合わせを生成する
一方Prologでは、例えば
s(Y, "test") :- s(Y,Z),t(Z)
みたいなホーン節があれば前述の結合は、rとsだけの結合の組み合わせさえ生成すればよくなる
Prologは演繹データベースの中でも本体部分のマッチングがかなり高速なので、適当なホーン説があれば関係データベースを含む他のデータベースのjoinよりもPrologのjoinは速い
Prologをデータベースとして利用するときには、データを定期的に走査して、データマイニング技術により、テーブル間の自然結合を高速にするホーン説をストックしている
(逆にいうと、データを頻繁に更新するときにはこの利点はまったくなくなる)
正確には、演繹データベースの中ではPrologはボディ部のマッチングが特に速く、適切なホーン説が存在すればあればJoinが関係データベースよりも速くなる
r(X,Y) and s(Y,Z) and t(Z)
という結合を考えるとき、Oracleみたいな関係データベースは、rとsとtの全タプルの全組み合わせを生成する
一方Prologでは、例えば
s(Y, "test") :- s(Y,Z),t(Z)
みたいなホーン節があれば前述の結合は、rとsだけの結合の組み合わせさえ生成すればよくなる
Prologは演繹データベースの中でも本体部分のマッチングがかなり高速なので、適当なホーン説があれば関係データベースを含む他のデータベースのjoinよりもPrologのjoinは速い
Prologをデータベースとして利用するときには、データを定期的に走査して、データマイニング技術により、テーブル間の自然結合を高速にするホーン説をストックしている
(逆にいうと、データを頻繁に更新するときにはこの利点はまったくなくなる)
408デフォルトの名無しさん
2012/01/09(月) 06:09:35.01 どこで無限ループおきてるかわからないときの
デバック方法みたいなものはないのでしょうか
デバック方法みたいなものはないのでしょうか
409デフォルトの名無しさん
2012/01/09(月) 06:44:57.67 >>408
http://www.swi-prolog.org/gtrace.html
SWI-Prologなら
gtrace, test_chat.
とかやるとステップ実行したり変数束縛やらコールスタックを確認できる。
http://www.swi-prolog.org/gtrace.html
SWI-Prologなら
gtrace, test_chat.
とかやるとステップ実行したり変数束縛やらコールスタックを確認できる。
410デフォルトの名無しさん
2012/01/15(日) 06:07:27.61 LiLFeSの話題もここでいいの?
411デフォルトの名無しさん
2012/01/15(日) 06:10:34.10 >>410
勿論、歓迎だけど、わかる人いるかなぁ。
勿論、歓迎だけど、わかる人いるかなぁ。
412デフォルトの名無しさん
2012/01/15(日) 06:49:13.11413デフォルトの名無しさん
2012/01/20(金) 21:44:26.43 プログラムを中断して、その状態を保存しておいて、後で再開するにはどうすればいいのでしょうか?
414デフォルトの名無しさん
2012/01/23(月) 17:13:47.54415デフォルトの名無しさん
2012/01/29(日) 17:12:11.70 PrologってSchemeの list? みたいなリスト判定ってないのかしら?
入れ子になってるリストを1つのリストにまとめるのが出来なくて困ってる
matome([a, b, [c, [d, e], f], g], X).
X = [a, b, c, d, e, f, g]
みたいなのを作りたくてappendいじくり回してるけど出来ない…
入れ子になってるリストを1つのリストにまとめるのが出来なくて困ってる
matome([a, b, [c, [d, e], f], g], X).
X = [a, b, c, d, e, f, g]
みたいなのを作りたくてappendいじくり回してるけど出来ない…
416デフォルトの名無しさん
2012/01/29(日) 17:49:43.61 >>415
パターンマッチで分岐すればいいだろ。
パターンマッチで分岐すればいいだろ。
417デフォルトの名無しさん
2012/01/30(月) 16:37:19.88418417
2012/01/30(月) 16:40:01.14419デフォルトの名無しさん
2012/01/30(月) 16:46:15.87 >>415
list/1の定義ができていれば、
平坦化([],[]).
平坦化([L|R1],L2) :-
list(L),
平坦化(L,L1),
append(L1,R2,L2),
平坦化(R1,R2).
平坦化([A|R1],[A|R2]) :-
\+(list(A)),
平坦化(R1,R2).
list/1の定義ができていれば、
平坦化([],[]).
平坦化([L|R1],L2) :-
list(L),
平坦化(L,L1),
append(L1,R2,L2),
平坦化(R1,R2).
平坦化([A|R1],[A|R2]) :-
\+(list(A)),
平坦化(R1,R2).
420デフォルトの名無しさん
2012/01/30(月) 16:53:29.64421デフォルトの名無しさん
2012/02/05(日) 01:47:19.97422デフォルトの名無しさん
2012/02/15(水) 05:18:36.92 尾崎隆大ってこの世界では有名なの?
423デフォルトの名無しさん
2012/02/15(水) 07:11:16.34424デフォルトの名無しさん
2012/02/16(木) 14:08:29.13 本人だと・・・
雷電どういうことだ!?
雷電どういうことだ!?
425デフォルトの名無しさん
2012/02/16(木) 14:11:21.62 ぬぅ ま・・・まさか
まさかこの目で見ようとは
まさかこの目で見ようとは
426デフォルトの名無しさん
2012/02/16(木) 16:53:25.72 知っているのか雷電!
427デフォルトの名無しさん
2012/02/16(木) 17:29:56.16 うむ
428デフォルトの名無しさん
2012/02/16(木) 19:42:37.03 つか本人が降臨しているとはな…ついったでお世話になってますお
429デフォルトの名無しさん
2012/02/17(金) 07:51:51.38 prologは再帰を積極的に用いてループを実現していますが。
趣向の域を出ない感じがします。
再帰でなければいけない論拠ってありますか?
趣向の域を出ない感じがします。
再帰でなければいけない論拠ってありますか?
430デフォルトの名無しさん
2012/02/17(金) 08:23:32.80431デフォルトの名無しさん
2012/02/17(金) 08:57:54.03432デフォルトの名無しさん
2012/02/17(金) 10:16:40.69433デフォルトの名無しさん
2012/02/17(金) 10:56:33.41 >再帰はループに変換できる
その上で何故趣向と思ったかの一つは。
同じ処理をさせるにしてもは再帰はループよりかなり効率が悪い。
再帰中はローカル変数が解放されないのでメモリの資源効率が悪い。
それにともなって実行効率も落ちます。
その上で何故趣向と思ったかの一つは。
同じ処理をさせるにしてもは再帰はループよりかなり効率が悪い。
再帰中はローカル変数が解放されないのでメモリの資源効率が悪い。
それにともなって実行効率も落ちます。
434デフォルトの名無しさん
2012/02/17(金) 11:00:39.29 再帰をループに自動変換し中間言語を生成するようなアルゴリズムでも
あれば凄いと思うのですが、僕の知っているprologにはそんなものは無いようです。
あれば凄いと思うのですが、僕の知っているprologにはそんなものは無いようです。
435デフォルトの名無しさん
2012/02/17(金) 11:02:20.28436デフォルトの名無しさん
2012/02/17(金) 11:07:45.84 末尾再帰をループに変換する処理系ならあるでしょ
437デフォルトの名無しさん
2012/02/17(金) 12:27:27.38 Prologだから論理プログラミングしなきゃいけないなんて誰が決めたんですか…!
あなたがかきたいようにかけばいいじゃないですかぁ…!
あなたがかきたいようにかけばいいじゃないですかぁ…!
438デフォルトの名無しさん
2012/02/17(金) 14:29:43.53 >>437
Prologは副目標、節の選択は出現順に逐次的に処理されることになっています。
このことを利用して、多くの利用者がPrologの手続き的解釈という立場に立ってこの言語を
利用しています。
?- repeat,read(X),write(X),X=end_of_file.
というような記述は一見極めて手続き的ですが、repeatの定義
repeat.
repeat :- repeat.
に再帰が「隠されて」います。論理式というモデルに対して何も付け加えたり変更したりして
いないPrologですから、再帰から逃れることはできませんが、隠すことはできるのです。
再帰的定義が連なっている定義は決して読みやすいとは言いがたいことが多く、この読みにくさ
から逃れるために情報の生成器(上の場合生成情報なしのrepeat)に再帰処理を押し込んで、
その後を手続き的に処理するという手法はごく普通のものです。
Prologは副目標、節の選択は出現順に逐次的に処理されることになっています。
このことを利用して、多くの利用者がPrologの手続き的解釈という立場に立ってこの言語を
利用しています。
?- repeat,read(X),write(X),X=end_of_file.
というような記述は一見極めて手続き的ですが、repeatの定義
repeat.
repeat :- repeat.
に再帰が「隠されて」います。論理式というモデルに対して何も付け加えたり変更したりして
いないPrologですから、再帰から逃れることはできませんが、隠すことはできるのです。
再帰的定義が連なっている定義は決して読みやすいとは言いがたいことが多く、この読みにくさ
から逃れるために情報の生成器(上の場合生成情報なしのrepeat)に再帰処理を押し込んで、
その後を手続き的に処理するという手法はごく普通のものです。
439デフォルトの名無しさん
2012/02/17(金) 17:45:06.40 とりあえず末尾再帰最適化とか、
proper tail callとか勉強してくれ。> 再帰くん
proper tail callとか勉強してくれ。> 再帰くん
440デフォルトの名無しさん
2012/02/26(日) 17:59:36.65441デフォルトの名無しさん
2012/02/29(水) 07:24:48.76 Prologの仕様のひとつにISO規格があるけれど、
あまり逸脱しないための枠組みくらいの意味しか
ない。そのくらい無視されている。
あまり逸脱しないための枠組みくらいの意味しか
ない。そのくらい無視されている。
442デフォルトの名無しさん
2012/02/29(水) 07:32:27.54 ISO規格の日本語訳が必要だね。それへのリンクをWikipediaの
冒頭付近に持ってくる。
冒頭付近に持ってくる。
443デフォルトの名無しさん
2012/02/29(水) 07:34:51.94 正式にPrologと名乗っていいかどうかを承認する機関とかあればいいけど
そこまでしてイソイソする需要もないんだし
どうしてもイソにこだわるならSWI-Prologとかならドキュンメントにイソってる述語かどうかかいてあるから
イソい述語だけ使うようにすればいいんじゃないかな
そこまでしてイソイソする需要もないんだし
どうしてもイソにこだわるならSWI-Prologとかならドキュンメントにイソってる述語かどうかかいてあるから
イソい述語だけ使うようにすればいいんじゃないかな
444デフォルトの名無しさん
2012/02/29(水) 07:39:57.82 イソい述語が貧弱すぎるのもダメなんじゃないかな。
最小限のイソの上にPure 100% Prologな述語を作りこんでいくって言う発想は
どうしても性能的に問題がでてくるでゲソ?
だからイソ述語を沢山定義していったほうがいいと思うの。
Level 1, 2, 3とか段階に分けてもいいかもしれんけどね。
レベルが高いほど高機能で低いほどよりプリミティブな述語なの。
最小限のイソの上にPure 100% Prologな述語を作りこんでいくって言う発想は
どうしても性能的に問題がでてくるでゲソ?
だからイソ述語を沢山定義していったほうがいいと思うの。
Level 1, 2, 3とか段階に分けてもいいかもしれんけどね。
レベルが高いほど高機能で低いほどよりプリミティブな述語なの。
445デフォルトの名無しさん
2012/02/29(水) 07:40:28.74446デフォルトの名無しさん
2012/02/29(水) 07:43:39.90 そういえば、SWI-Prologのdoc_serverだっけ?
pldoc形式かなんかで書いたドキュメント文の末尾にピリオドが自動で付与されるから、
出力が「こんにちは。.」みたいな不恰好になっちゃうよね。
pldoc形式かなんかで書いたドキュメント文の末尾にピリオドが自動で付与されるから、
出力が「こんにちは。.」みたいな不恰好になっちゃうよね。
447デフォルトの名無しさん
2012/02/29(水) 07:44:07.13 もしかしてイカ娘さんの登場かな?
448デフォルトの名無しさん
2012/03/12(月) 23:21:34.18 初心者です。
Prologのソースファイルに
do :- ...
do.
のような記述がよくあるんですが、これってdoのbodyをdoでくるまずそのまま書いちゃだめなんでしょうか?
Prologのソースファイルに
do :- ...
do.
のような記述がよくあるんですが、これってdoのbodyをdoでくるまずそのまま書いちゃだめなんでしょうか?
449デフォルトの名無しさん
2012/03/12(月) 23:42:15.80 >>448
具体的なコードをコピペしてもらえると、期待する答えがもらえやすいと思う
とりあえず可能性を推測してみる
・1行目のbody部では(たとえばバックトラックを応用した)手続き型の処理が書かれていて、
必ず否定で処理が終わる
でも、処理全体としては肯定で終了させたいから、2行目に必ず真となる述語が置かれている
・述語doに引数があり、複数のbody付き定義でcase文に相当する多分岐処理を記述している
そして、最後のbody無しdoは(case文における)空のdefault節を表現している
具体的なコードをコピペしてもらえると、期待する答えがもらえやすいと思う
とりあえず可能性を推測してみる
・1行目のbody部では(たとえばバックトラックを応用した)手続き型の処理が書かれていて、
必ず否定で処理が終わる
でも、処理全体としては肯定で終了させたいから、2行目に必ず真となる述語が置かれている
・述語doに引数があり、複数のbody付き定義でcase文に相当する多分岐処理を記述している
そして、最後のbody無しdoは(case文における)空のdefault節を表現している
450デフォルトの名無しさん
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 なんかのお世話になって、
書き写し、書き写し、説明を解読しながら書くものだよ。
551デフォルトの名無しさん
2012/08/27(月) 11:50:25.32 はあ?
552デフォルトの名無しさん
2012/08/27(月) 16:10:05.17 >>550
そのリンクは第3版ですが、すでに第4版が出ています。
PROLOG Programming for Artificial Intelligence
http://www.amazon.co.jp/dp/0321417461
そのリンクは第3版ですが、すでに第4版が出ています。
PROLOG Programming for Artificial Intelligence
http://www.amazon.co.jp/dp/0321417461
553デフォルトの名無しさん
2012/08/27(月) 18:11:20.68 大学の演習でSchemeでProlog処理系を作らされたから、利用する機能を限定すればなればかなりのProlog処理系は自作できると思う
554デフォルトの名無しさん
2012/08/28(火) 19:24:32.09 SchemeのPrologならminiKanrenは凄い短いソースで出てきてるね
Kanrenの方が使いやすいけど
Kanrenの方が使いやすいけど
555デフォルトの名無しさん
2012/08/31(金) 16:31:31.25 沖電気のサイトにpython実装のprolog処理系の記事が掲載されてたよ
556デフォルトの名無しさん
2012/09/27(木) 11:46:27.80 他のスレ(正規表現)での続きを書くと、
日本語で書かれてしかもPrologに触れているツイートのうち
評価を含んでいるものを調べると肯定、否定の割合は2:1くらい。
それとは別に、難しい、分からないとのツイートは多い。
日本語で書かれてしかもPrologに触れているツイートのうち
評価を含んでいるものを調べると肯定、否定の割合は2:1くらい。
それとは別に、難しい、分からないとのツイートは多い。
557デフォルトの名無しさん
2012/09/27(木) 12:11:47.56 Prologでする画像処理なんてありましたっけ?
558デフォルトの名無しさん
2012/09/27(木) 15:08:31.86 >>557
Prologの欠点は遅いことです。それもC言語に比べて数百倍の単位で。
遅い理由は、バックトラックに備えてスタックを余分に積むことや、リストを
含む構造体のユニフィケーションの作業量の多さ、アトムテーブルの管理、
GCなどいろいろですが、これだけ遅いと対象範囲がビットマップ全体になる
計算はする気がなくなります。それで汎用システムとしての画像処理に適用
されたという話は聞いたことがありません。
Prologによる画像処理アルゴリズムの研究としては
http://www.amazon.co.jp/dp/0387196471 があります。
Prologの欠点は遅いことです。それもC言語に比べて数百倍の単位で。
遅い理由は、バックトラックに備えてスタックを余分に積むことや、リストを
含む構造体のユニフィケーションの作業量の多さ、アトムテーブルの管理、
GCなどいろいろですが、これだけ遅いと対象範囲がビットマップ全体になる
計算はする気がなくなります。それで汎用システムとしての画像処理に適用
されたという話は聞いたことがありません。
Prologによる画像処理アルゴリズムの研究としては
http://www.amazon.co.jp/dp/0387196471 があります。
559デフォルトの名無しさん
2012/09/27(木) 15:42:42.51 Wales大の人だな。MacPrologを改造したProlog+。
http://www.lpa.co.uk/はまだ活動しているみたいだな。
http://www.lpa.co.uk/はまだ活動しているみたいだな。
560デフォルトの名無しさん
2012/10/02(火) 10:11:30.88 遅い欠点をもつPrologがAIのシステムに導入されたのはなぜ?
現在ではもう時代遅れになっている言語なのかな?
現在ではもう時代遅れになっている言語なのかな?
561デフォルトの名無しさん
2012/10/02(火) 11:39:10.46 cutのあるバックトラックを使って、ほぼ宣言的に記述できるから。
562デフォルトの名無しさん
2012/10/02(火) 13:53:16.16 >>560
C言語などとの相対速度の差は現在の方がさらに開いていると思いますが、
AIは極めて遅い人間の脳がモデルですから、元々速度はあまり問題ありません。
最後は例えばRubyでPythonで同じくらい簡単に書けますかどうですかということ
でしょう。
Prologについては、まだまだ2-3割しかその能力を引き出す努力がなされて
おらず、これからどうなって行くかまったく予断はできません。
C言語などとの相対速度の差は現在の方がさらに開いていると思いますが、
AIは極めて遅い人間の脳がモデルですから、元々速度はあまり問題ありません。
最後は例えばRubyでPythonで同じくらい簡単に書けますかどうですかということ
でしょう。
Prologについては、まだまだ2-3割しかその能力を引き出す努力がなされて
おらず、これからどうなって行くかまったく予断はできません。
563デフォルトの名無しさん
2012/10/02(火) 15:20:49.89 なんか斜めです
> 元々速度はあまり問題ありません。
> RubyでPythonで同じくらい簡単に書けます
> 元々速度はあまり問題ありません。
> RubyでPythonで同じくらい簡単に書けます
564デフォルトの名無しさん
2012/10/02(火) 15:23:18.10 >>563
Prologでも書けませんが。
Prologでも書けませんが。
565Prolog工作員
2012/10/02(火) 15:43:11.34 >>563
今日、プログラマの水準は高く、Prologクラスの推論ならば、簡単に
インタプリタのロジックを各言語に組み込む方はいます。しかし、その
人が論理学にも精通していたとしても、Prologのプログラミング程度の
単純な論理であっても、いきなりある一定単位持続して書き並べていく
ことは多くの場合そんなに簡単なことではない。
だから、日常的に論理式の記述を習慣付けるためにPrologを使うのです。
今日、プログラマの水準は高く、Prologクラスの推論ならば、簡単に
インタプリタのロジックを各言語に組み込む方はいます。しかし、その
人が論理学にも精通していたとしても、Prologのプログラミング程度の
単純な論理であっても、いきなりある一定単位持続して書き並べていく
ことは多くの場合そんなに簡単なことではない。
だから、日常的に論理式の記述を習慣付けるためにPrologを使うのです。
566デフォルトの名無しさん
2012/10/02(火) 16:17:28.79 Prologレベルの推論エンジンは簡単に書けるなら、
ASP solver competitionにでも参加してみてくれ。
まさかPrologベースのシステムに負けないよな?
ASP solver competitionにでも参加してみてくれ。
まさかPrologベースのシステムに負けないよな?
567デフォルトの名無しさん
2012/10/02(火) 17:33:16.76 1.まずPythonでPrologを実装します
568Prolog工作員
2012/10/02(火) 17:43:02.82569デフォルトの名無しさん
2012/10/03(水) 01:00:34.38 ISOに合わせるように頑張ってたけど
bagofが上手く実装できなくて詰んだはww
bagofが上手く実装できなくて詰んだはww
570デフォルトの名無しさん
2012/10/04(木) 16:06:23.95571デフォルトの名無しさん
2012/10/04(木) 17:11:04.53 人間の脳は遅いです。ひとつのプロセッサーを見れば。ところが、1000個以上の
プロセッサが協調して働けば、何十万個のプロセッサ付き記憶装置から読み出せれば
偉大な働きをする。囲碁のような単純な思考でもそうでしょう。名人は1秒間に
何千万手に相当する手を読みますが、それは画像認識に近いレベルでなされる。
浮かんだ画像をこれは、だめ。これは、可能性があると。その一瞬10^3どころではない
オーダーの記憶装置付きのセルが働いている考えられる。
ICOTの目指した並行処理は間違ってはいなかったと思います。
プロセッサが協調して働けば、何十万個のプロセッサ付き記憶装置から読み出せれば
偉大な働きをする。囲碁のような単純な思考でもそうでしょう。名人は1秒間に
何千万手に相当する手を読みますが、それは画像認識に近いレベルでなされる。
浮かんだ画像をこれは、だめ。これは、可能性があると。その一瞬10^3どころではない
オーダーの記憶装置付きのセルが働いている考えられる。
ICOTの目指した並行処理は間違ってはいなかったと思います。
572デフォルトの名無しさん
2012/10/05(金) 00:03:03.08 飛行機は鳥のようにはばたかず、プロペラを回して飛ぶ。
自動車は馬のように駆けず、タイヤを回して走る。
AIは…?
自動車は馬のように駆けず、タイヤを回して走る。
AIは…?
573デフォルトの名無しさん
2012/10/05(金) 00:51:55.41 >>572
emotionとかethics抜きで単体のintelligenceってのが
そもそも存在するのか?
ないものをマネようとして失敗してるんじゃないかと思う。
いや色々な知見は得られているんだけれども。
emotionとかethics抜きで単体のintelligenceってのが
そもそも存在するのか?
ないものをマネようとして失敗してるんじゃないかと思う。
いや色々な知見は得られているんだけれども。
574デフォルトの名無しさん
2012/10/05(金) 05:50:08.90 >>572
強い、弱いという分類がされますが、広義、狭義という分類も可能ですね。
馬の例えだと、馬の脚を車軸と車輪、タイヤで置き換えた。そこで止まって
しまったり、そこから発展して、鳥から飛行機->ジェット機のように別の物に
進化していってしまう。そういう展開全て包容してのAIというのもあり得る。
けれども少なくとも20年前のAIブームの頃には、こういうものはAI研究の
「お零れ」と認識していた。エキスパートシステムもそう。
一時的に馬の蹄がタイヤであっても、そこに止まっていては馬の神経系や
骨格の力学的な研究とも出会うことができないから、それは所詮工業技術
じゃないか。こちらの方が一般的な見解ではないか。
強い、弱いという分類がされますが、広義、狭義という分類も可能ですね。
馬の例えだと、馬の脚を車軸と車輪、タイヤで置き換えた。そこで止まって
しまったり、そこから発展して、鳥から飛行機->ジェット機のように別の物に
進化していってしまう。そういう展開全て包容してのAIというのもあり得る。
けれども少なくとも20年前のAIブームの頃には、こういうものはAI研究の
「お零れ」と認識していた。エキスパートシステムもそう。
一時的に馬の蹄がタイヤであっても、そこに止まっていては馬の神経系や
骨格の力学的な研究とも出会うことができないから、それは所詮工業技術
じゃないか。こちらの方が一般的な見解ではないか。
575デフォルトの名無しさん
2012/10/05(金) 12:20:07.04 エキスパートシステムはロジックの部分がまさに本流なわけだけど…
576デフォルトの名無しさん
2012/10/05(金) 13:27:22.28577デフォルトの名無しさん
2012/10/05(金) 14:09:15.30 >>562
> AIは極めて遅い人間の脳がモデルですから、元々速度はあまり問題ありません。
いやでも、フレーム問題みたいなのも、
人間の脳の処理速度よりコンピュータの処理速度のほうがずっと高速だから
解決できるという見通しが当初からあったんでしょ?
つまり、コンピュータの高速な処理速度にAI実現の将来の希望を託していた
ことからすると、もともと処理速度は重要な問題だったわけで。
> AIは極めて遅い人間の脳がモデルですから、元々速度はあまり問題ありません。
いやでも、フレーム問題みたいなのも、
人間の脳の処理速度よりコンピュータの処理速度のほうがずっと高速だから
解決できるという見通しが当初からあったんでしょ?
つまり、コンピュータの高速な処理速度にAI実現の将来の希望を託していた
ことからすると、もともと処理速度は重要な問題だったわけで。
578デフォルトの名無しさん
2012/10/05(金) 16:09:56.25 >>577
でも速度に「追っかけられる」というような業務ではないです。
でも速度に「追っかけられる」というような業務ではないです。
579デフォルトの名無しさん
2012/10/05(金) 18:06:17.69 天気予報に使ってるエキスパートシステムは速度が重要だよ。
予報が民間に許可された今はリアルタイム予報が期待されているから。
予報が民間に許可された今はリアルタイム予報が期待されているから。
580デフォルトの名無しさん
2012/10/08(月) 15:01:54.60 確かにリアルタイムな天気予報は期待されてるけど、
具体的にはゲリラ豪雨みたいなイレギュラーな変化の予報。
これはエキスパートシステムのような大量の情報から引っこ抜くといった
性質のものでは無いのでは…。
具体的にはゲリラ豪雨みたいなイレギュラーな変化の予報。
これはエキスパートシステムのような大量の情報から引っこ抜くといった
性質のものでは無いのでは…。
581デフォルトの名無しさん
2012/10/08(月) 15:36:21.25 >>580
大気シミュの結果、各種リアルタイム測定値、過去の天候パターン記録などは、
エキスパートシステムのソースの一つなのよ。
扱う知識の一つというわけ。天候予測システムについても、
エキスパートシステム論についても知識が古過ぎ。
大気シミュの結果、各種リアルタイム測定値、過去の天候パターン記録などは、
エキスパートシステムのソースの一つなのよ。
扱う知識の一つというわけ。天候予測システムについても、
エキスパートシステム論についても知識が古過ぎ。
582デフォルトの名無しさん
2012/10/08(月) 17:11:51.49 いくら計算頑張っても元データの精度は超えないぞ。
縦横5km、高さ1kmのメッシュだからな。
せめてあと2ケタのデータ精度向上がないと、計算だけじゃ
ゲリラ豪雨の予測には届かないんじゃないか。
縦横5km、高さ1kmのメッシュだからな。
せめてあと2ケタのデータ精度向上がないと、計算だけじゃ
ゲリラ豪雨の予測には届かないんじゃないか。
583デフォルトの名無しさん
2012/10/08(月) 17:58:25.36 GPV以外にも観測データはありまして…
584デフォルトの名無しさん
2012/10/18(木) 11:14:08.91 Prologの宿題スレはなくなってしまったか。
585デフォルトの名無しさん
2012/10/19(金) 09:53:31.41586デフォルトの名無しさん
2012/10/19(金) 10:04:01.70 >>585
代わりに「Prolog演習の課題を書き込みましょう」というスレを作ってみたが、
2日くらいでこれも削られた。聞くところによれば、今はテンプレの書かれていない
新スレは全部削られるらしい。スレたて荒らしの退治の余波で。
代わりに「Prolog演習の課題を書き込みましょう」というスレを作ってみたが、
2日くらいでこれも削られた。聞くところによれば、今はテンプレの書かれていない
新スレは全部削られるらしい。スレたて荒らしの退治の余波で。
587Prolog工作員
2012/10/19(金) 18:36:19.25 最近のSWI-Prologでは、アトムや関数名の中に改行が含まれても
構わないようだ。'\n'で表現する必要がなく、自然に改行できる。
http://nojiriko.asia/prolog/j72_387.html
http://nojiriko.asia/prolog/c160_246.html
の最初の述語のような定義が可能である。これでシングルクォートも
省ければすばらしいのだが。
構わないようだ。'\n'で表現する必要がなく、自然に改行できる。
http://nojiriko.asia/prolog/j72_387.html
http://nojiriko.asia/prolog/c160_246.html
の最初の述語のような定義が可能である。これでシングルクォートも
省ければすばらしいのだが。
588デフォルトの名無しさん
2012/10/19(金) 23:53:01.60 論文とか書く人ってどのProlog処理系使ってるのだろうか…
589デフォルトの名無しさん
2012/10/21(日) 17:48:15.67590デフォルトの名無しさん
2012/10/21(日) 21:04:53.19591デフォルトの名無しさん
2012/10/22(月) 08:29:19.82 「Prologでまったり」から始まりこのスレに至るProlog系スレは、他の
スレに較べて、圧倒的にソースコード掲載の比率が高かった。
この希少な伝統を守るべく、どしどしソースを上げようではないか。
スレに較べて、圧倒的にソースコード掲載の比率が高かった。
この希少な伝統を守るべく、どしどしソースを上げようではないか。
592デフォルトの名無しさん
2012/10/22(月) 08:59:03.59 「憲法改正」は総選挙の争点になるか
安倍さんは「強い日本」「美しい日本」にしたいということで、まずは憲法9条の改正を目指す。
総裁選も盛り上がり、自民党が一気に国民の期待を集めている。
勢いに乗る安倍晋三総裁は、次期衆院選で憲法改正を争点のひとつにする意向を示している。
詳細 2012/10/21
http://www.zakzak.co.jp/society/politics/news/20121021/plt1210210709000-n1.htm
安倍さんは「強い日本」「美しい日本」にしたいということで、まずは憲法9条の改正を目指す。
総裁選も盛り上がり、自民党が一気に国民の期待を集めている。
勢いに乗る安倍晋三総裁は、次期衆院選で憲法改正を争点のひとつにする意向を示している。
詳細 2012/10/21
http://www.zakzak.co.jp/society/politics/news/20121021/plt1210210709000-n1.htm
593デフォルトの名無しさん
2012/10/22(月) 09:00:20.64 zakzakの記事貼るぐらいならまだイカリソースのほうがよかった。
594デフォルトの名無しさん
2012/10/22(月) 09:54:47.36 >>592 % これを述語化しようと思ったが、結構難しく断念。 代わりに最近twitterに張ったものをここにも載せる。出典は空海の秘蔵宝鑰
暗生始 :- 生生生生.
冥生終 :- 死死死死.
暗生始(_) :- 生生生生(_).
冥生終(_) :- 死死死死(_).
暗生始 :- 生生生生.
冥生終 :- 死死死死.
暗生始(_) :- 生生生生(_).
冥生終(_) :- 死死死死(_).
595デフォルトの名無しさん
2012/10/22(月) 10:15:10.89 % これもtwitterに出したもの。バブルソート。カットが一ヶ所入るのが癪。
バブルソート(L1,L2) :-
軽い泡はちょっと浮き上がる(L1,L3),
泡が浮き上がったら最初からやり直す(L3,L2),!.
バブルソート(L,L) :-
浮き上がる泡がなくなったらバブルソート終了.
軽い泡はちょっと浮き上がる(L1,L3) :-
append(L0,[_重い泡,_軽い泡|R],L1),
_重い泡 @> _軽い泡,
append(L0,[_軽い泡,_重い泡|R],L3).
泡が浮き上がったら最初からやり直す(L3,L2) :-
バブルソート(L3,L2).
浮き上がる泡がなくなったらバブルソート終了.
バブルソート(L1,L2) :-
軽い泡はちょっと浮き上がる(L1,L3),
泡が浮き上がったら最初からやり直す(L3,L2),!.
バブルソート(L,L) :-
浮き上がる泡がなくなったらバブルソート終了.
軽い泡はちょっと浮き上がる(L1,L3) :-
append(L0,[_重い泡,_軽い泡|R],L1),
_重い泡 @> _軽い泡,
append(L0,[_軽い泡,_重い泡|R],L3).
泡が浮き上がったら最初からやり直す(L3,L2) :-
バブルソート(L3,L2).
浮き上がる泡がなくなったらバブルソート終了.
596595 書き直し
2012/10/22(月) 10:18:12.44バブルソート(L,L) :-
浮き上がる泡がなくなったらバブルソート終了.
軽い泡はちょっと浮き上がる(L1,L3) :-
append(L0,[_重い泡,_軽い泡|R],L1),
_重い泡 @> _軽い泡,
append(L0,[_軽い泡,_重い泡|R],L3).
泡が浮き上がったら最初からやり直す(L3,L2) :-
バブルソート(L3,L2).
浮き上がる泡がなくなったらバブルソート終了.
597デフォルトの名無しさん
2012/10/22(月) 10:33:43.08 最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :-
'MがNより小さい時はNとMを置換して実行する'(M,N,_最大公約数),!.
最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :-
ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を
除数として割ることを繰り返す(M,N,_最大公約数).
'MがNより小さい時はNとMを置換して実行する'(M,N,_最大公約数) :-
M < N,
最大公約数をユークリッドの互除法で求める(N,M,_最大公約数).
ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数とし
て割ることを繰り返す(_被除数,_除数,_最大公約数) :-
_剰余 is _被除数 mod _除数,
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰
り返す(_除数,_剰余,_最大公約数).
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_
除数,0,_最大公約数) :-
割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数),!.
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_
除数,_剰余,_最大公約数) :-
'割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除
数,_剰余,_最大公約数).
割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数) :-
_除数 = _最大公約数.
'割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除数,_剰余,
_最大公約数) :-
ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を
除数として割ることを繰り返す(_除数,_剰余,_最大公約数).
'MがNより小さい時はNとMを置換して実行する'(M,N,_最大公約数),!.
最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :-
ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を
除数として割ることを繰り返す(M,N,_最大公約数).
'MがNより小さい時はNとMを置換して実行する'(M,N,_最大公約数) :-
M < N,
最大公約数をユークリッドの互除法で求める(N,M,_最大公約数).
ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数とし
て割ることを繰り返す(_被除数,_除数,_最大公約数) :-
_剰余 is _被除数 mod _除数,
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰
り返す(_除数,_剰余,_最大公約数).
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_
除数,0,_最大公約数) :-
割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数),!.
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_
除数,_剰余,_最大公約数) :-
'割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除
数,_剰余,_最大公約数).
割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数) :-
_除数 = _最大公約数.
'割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除数,_剰余,
_最大公約数) :-
ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を
除数として割ることを繰り返す(_除数,_剰余,_最大公約数).
598デフォルトの名無しさん
2012/10/23(火) 04:01:29.74 昨日、「Prologの宿題片付けます」スレが第二編として復活しました。
http://toro.2ch.net/test/read.cgi/tech/1350893602/
出題-解答系はこちらに載せましょう。
http://toro.2ch.net/test/read.cgi/tech/1350893602/
出題-解答系はこちらに載せましょう。
599デフォルトの名無しさん
2012/10/23(火) 09:52:31.68 そういえば、「いろんな言語で宿題 第5編」スレもDat落ちしてしまった。
勝手は事実上のPrologスレといえるほど、肩入れしていたのだが最近は
さっぱりで、二ヶ月近くも書き込みがなかったせいか削除された。
「いろんな言語で宿題」スレの歴史はム板の中でも秀逸だと思うが。
勝手は事実上のPrologスレといえるほど、肩入れしていたのだが最近は
さっぱりで、二ヶ月近くも書き込みがなかったせいか削除された。
「いろんな言語で宿題」スレの歴史はム板の中でも秀逸だと思うが。
600デフォルトの名無しさん
2012/10/23(火) 10:40:52.30 そのスレはJのコードの量だけでもちょっと見ることができないものだった。
JはAPL後継で有名だが、ほとんど知られていない数式処理関係のプログラム言語の
コードがかなり掲載されて凄いスレだったことは間違いない。私どもProlog勢が
書き込み過ぎて、Prologスレと見られてHaskell等関数型の書き込みが少なかった
のが残念だったけど。
JはAPL後継で有名だが、ほとんど知られていない数式処理関係のプログラム言語の
コードがかなり掲載されて凄いスレだったことは間違いない。私どもProlog勢が
書き込み過ぎて、Prologスレと見られてHaskell等関数型の書き込みが少なかった
のが残念だったけど。
601デフォルトの名無しさん
2012/10/23(火) 10:52:07.55 いろんな言語で宿題 第五編
http://logstar.jp/toro.2ch.net/tech/1276873238/
http://logstar.jp/toro.2ch.net/tech/1276873238/
602デフォルトの名無しさん
2012/10/23(火) 11:14:19.57 マイナー言語がハッスルするスレですね。
603デフォルトの名無しさん
2012/10/23(火) 11:51:01.56 >>602
「いろんな言語で宿題」スレは、大変マニアックなと言っては失礼に当たるかも知れ
ない専門家が一人いて、5題に1題くらいの割ではあったが、次々と書き込んで
くださった。私は結局覚えなかったし、ほとんど分からなかったが、十分楽しんだ。
「いろんな言語で宿題」スレは、大変マニアックなと言っては失礼に当たるかも知れ
ない専門家が一人いて、5題に1題くらいの割ではあったが、次々と書き込んで
くださった。私は結局覚えなかったし、ほとんど分からなかったが、十分楽しんだ。
604デフォルトの名無しさん
2012/10/24(水) 15:22:58.60605デフォルトの名無しさん
2012/10/24(水) 15:43:33.97 間違いないことは、この3年間に、最もプログラムがリンクを張るのでなく
直接2chに書き込まれたプログラム言語はPrologだということ。それも
圧倒的に。それではなぜ書き込むことができたかが、重要な点なのだが。
直接2chに書き込まれたプログラム言語はPrologだということ。それも
圧倒的に。それではなぜ書き込むことができたかが、重要な点なのだが。
606デフォルトの名無しさん
2012/11/04(日) 16:04:59.78 三交代の当直表を作るときなんかは便利そうなのになぁ。縦横の
条件と初期条件を満たす解を探すのなんて数独と同じだよね。
それとクリティカルパスを考えるときに、データ構造を網構造として手続き型で
処理するか、ガッサリPrologエンジンに任せるか。まだメモリ8GB程度じゃ
遅いのかねぇ?
条件と初期条件を満たす解を探すのなんて数独と同じだよね。
それとクリティカルパスを考えるときに、データ構造を網構造として手続き型で
処理するか、ガッサリPrologエンジンに任せるか。まだメモリ8GB程度じゃ
遅いのかねぇ?
607デフォルトの名無しさん
2012/11/09(金) 21:14:46.06 今でも結構人気なんですね。SchemeやGoよりGitHub利用が多い。
http://jp.techcrunch.com/archives/20120912javascript-tops-latest-programming-language-popularity-ranking-from-redmonk/
http://jp.techcrunch.com/archives/20120912javascript-tops-latest-programming-language-popularity-ranking-from-redmonk/
608デフォルトの名無しさん
2012/11/10(土) 11:41:57.60609デフォルトの名無しさん
2012/11/10(土) 18:20:35.78 モノ珍しいので一度は触ってみるという意味での人気であって、業務で使っているとは思えない
610デフォルトの名無しさん
2012/11/11(日) 05:08:35.66 >>609
日本の場合、大学に100以上の講座があって、それを受講したら
お終いなので物珍しいからに近い。あちらでは、日本でSQL枠と
されている就職口が論理という枠になっていて権威もある。論理
枠の中でPrologは一定の地位を占めていて、想像以上に実務でも
使われている。
日本の場合、大学に100以上の講座があって、それを受講したら
お終いなので物珍しいからに近い。あちらでは、日本でSQL枠と
されている就職口が論理という枠になっていて権威もある。論理
枠の中でPrologは一定の地位を占めていて、想像以上に実務でも
使われている。
611デフォルトの名無しさん
2012/11/11(日) 05:34:52.19 只々類似パターンの再帰の繰り返しのPrologがStackoverflowで質問数が
すくないことはよくわかる。ところが何故、まったくライブラリ指向でない
言語の代表のPrologがGitHubに結構upされているのだろうか。
すくないことはよくわかる。ところが何故、まったくライブラリ指向でない
言語の代表のPrologがGitHubに結構upされているのだろうか。
612デフォルトの名無しさん
2012/11/11(日) 05:58:11.84 GitHubの誤判定ではないだろうか
例えばhttps://github.com/languages/PrologのMost Starred Overallの
上位5つのリポジトリを見てみると、
https://github.com/onyxfish/csvkit
https://github.com/vangelisv/thea
https://github.com/reprappro/Mendel
https://github.com/Attempto/APE
https://github.com/leaflabs/oak
このうち実際にPrologを使っているのはtheaとAPEの2つに見える
例えばhttps://github.com/languages/PrologのMost Starred Overallの
上位5つのリポジトリを見てみると、
https://github.com/onyxfish/csvkit
https://github.com/vangelisv/thea
https://github.com/reprappro/Mendel
https://github.com/Attempto/APE
https://github.com/leaflabs/oak
このうち実際にPrologを使っているのはtheaとAPEの2つに見える
613デフォルトの名無しさん
2012/11/11(日) 13:01:59.07 ワロタ
拡張子plをPrologプログラムと勘違いしてるらしい。
https://github.com/onyxfish/csvkit/blob/master/examples/realdata/census_2010/ilgeo2010_excerpt.pl
拡張子txtの言語作ればGitHub一位まちがいなし!
ちなみに607です…
拡張子plをPrologプログラムと勘違いしてるらしい。
https://github.com/onyxfish/csvkit/blob/master/examples/realdata/census_2010/ilgeo2010_excerpt.pl
拡張子txtの言語作ればGitHub一位まちがいなし!
ちなみに607です…
614デフォルトの名無しさん
2012/11/11(日) 15:36:43.35 拡張子plはPerlじゃないし、GHCはHaskellのコンパイラじゃないのは世界の常識
615デフォルトの名無しさん
2012/11/11(日) 16:12:53.88 前者はともかく後者はもう日本国内ですら通じないだろ……
616デフォルトの名無しさん
2012/11/11(日) 17:19:10.25 ここ:-を,どこだと|思って,るんだ!.
617デフォルトの名無しさん
2012/11/11(日) 18:07:12.48 ソースに使われてる言語の判定にはこれ使ってるっぽいね
https://github.com/github/linguist
Perl製と判定されたソフトの8割が実はProlog製だった可能性が出てきたな……
https://github.com/github/linguist
Perl製と判定されたソフトの8割が実はProlog製だった可能性が出てきたな……
618デフォルトの名無しさん
2012/11/14(水) 22:28:53.31 あるあ・・・ねーよ
619デフォルトの名無しさん
2012/11/18(日) 03:03:49.27 連番のエロ画像をダウンロードするスクリプトください
620デフォルトの名無しさん
2012/11/18(日) 19:47:08.62621デフォルトの名無しさん
2012/11/23(金) 19:45:54.79 >>619
エロかどうかの画像解析も必要?
エロかどうかの画像解析も必要?
622デフォルトの名無しさん
2012/11/24(土) 01:11:45.59 必須
623デフォルトの名無しさん
2013/01/30(水) 14:34:59.52 Prologの実装がいろいろあるけど
_ が任意にマッチするものと
_.1 _.2 みたいにマッチする部分集合をわけるものがあるみたいですね
それぞれの方式に名前がついてたりするのでしょうか
_ が任意にマッチするものと
_.1 _.2 みたいにマッチする部分集合をわけるものがあるみたいですね
それぞれの方式に名前がついてたりするのでしょうか
624デフォルトの名無しさん
2013/02/01(金) 08:26:29.05625デフォルトの名無しさん
2013/02/03(日) 16:44:21.38 miniKanren
cKanren
という処理系です
cKanren
という処理系です
626デフォルトの名無しさん
2013/02/03(日) 19:55:52.08 _1 は知ってるけど _.1 は知らない
627デフォルトの名無しさん
2013/02/16(土) 23:41:31.81 日常の諸問題の解決にPrologを使っている人はいる?
628デフォルトの名無しさん
2013/02/16(土) 23:57:59.44629デフォルトの名無しさん
2013/02/17(日) 00:01:25.81 過疎スレでこんなに早くレスをもらえるとは思いませんでした。
head形式とはどういうものですか?
head形式とはどういうものですか?
630デフォルトの名無しさん
2013/02/17(日) 00:22:14.39 meisi(山田, xxx-xxxx, 東京都○○○○, 080-xxxx, 080-xxxx, ○○社, ○○課, 201301xx, 飲み会).
memo(201302xx, 隕石落ちた).
todo(201302xx, [郵便とりに行く, 印鑑確認する, 製本する, 連絡する, 掃除する, メールする/12]).
みたいなのをジャンル分けずにどんどん同じファイルにアペンド
今40000タプルくらいある
memo(201302xx, 隕石落ちた).
todo(201302xx, [郵便とりに行く, 印鑑確認する, 製本する, 連絡する, 掃除する, メールする/12]).
みたいなのをジャンル分けずにどんどん同じファイルにアペンド
今40000タプルくらいある
631デフォルトの名無しさん
2013/02/17(日) 00:32:15.91 (・∀・)イイ!
実生活でPrologが役立っている例を始めて見ました
実生活でPrologが役立っている例を始めて見ました
私は社内IRCに
?- ... と打ち込むと謹製Prologが答えてくれるボット投入してます
誰も使ってないけど
?- ... と打ち込むと謹製Prologが答えてくれるボット投入してます
誰も使ってないけど
633デフォルトの名無しさん
2013/02/17(日) 13:26:35.69 昔Java版のprologが出たときに大学の演習で作ったルールベースシステムをアプレットに移植して人工知能の会話システムを作ったけど、大して身のあるシステムにはならなかった
634デフォルトの名無しさん
2013/02/17(日) 15:09:00.03 Prologは初等教育に組み込むべきですね。プログラム言語としてではなく、
情報・知識の記述形式として。
情報・知識の記述形式として。
635デフォルトの名無しさん
2013/02/22(金) 17:22:47.00 初心者ですので初歩的な質問をさせていただきます。よろしくお願いします。
prologで単純な迷路を説くのは簡単ですが、縦横につながった升目(または碁石など)の数を数えるプログラムに難渋しています。
他の言語に習って、5個つながっているかどうかを、
heisa1(5,_,_,_,_,_,_,_):-!.
heisa1(N,W,H,X,Y,Field,L0,L):-
getv(W,H,X,Y,Field,V)
,(var(V)->((not(member((X,Y),L))->(adde((X,Y),L,L1),N1 is N+1);(N1=N,L1=L))
,(X<W->(X1 is X+1,heisa1(N1,W,H,X1,Y,Field,L0,L1)))
,(Y<H->(Y1 is Y+1,heisa1(N1,W,H,X,Y1,Field,L0,L1)))
,(X>1->(X1 is X-1,heisa1(N1,W,H,X1,Y,Field,L0,L1)))
,(Y>1->(Y1 is Y-1,heisa1(N1,W,H,X,Y1,Field,L0,L1))))).
のような書き方で、細部をいろいろ工夫しても、無駄なバックトラックが起こってうまくいきません。
どのように書けばよいのでしょうか。ご教示いただければ幸です。
prologで単純な迷路を説くのは簡単ですが、縦横につながった升目(または碁石など)の数を数えるプログラムに難渋しています。
他の言語に習って、5個つながっているかどうかを、
heisa1(5,_,_,_,_,_,_,_):-!.
heisa1(N,W,H,X,Y,Field,L0,L):-
getv(W,H,X,Y,Field,V)
,(var(V)->((not(member((X,Y),L))->(adde((X,Y),L,L1),N1 is N+1);(N1=N,L1=L))
,(X<W->(X1 is X+1,heisa1(N1,W,H,X1,Y,Field,L0,L1)))
,(Y<H->(Y1 is Y+1,heisa1(N1,W,H,X,Y1,Field,L0,L1)))
,(X>1->(X1 is X-1,heisa1(N1,W,H,X1,Y,Field,L0,L1)))
,(Y>1->(Y1 is Y-1,heisa1(N1,W,H,X,Y1,Field,L0,L1))))).
のような書き方で、細部をいろいろ工夫しても、無駄なバックトラックが起こってうまくいきません。
どのように書けばよいのでしょうか。ご教示いただければ幸です。
636デフォルトの名無しさん
2013/02/22(金) 17:25:15.99 >>635
ちなみに、私は切羽詰って、
heisa(0,_,_,_,_,EL,EL):-!.
heisa(_,_,_,_,[],EL,EL):-fail,!.
heisa(N,W,H,Field,[Pos|Re],EL,EL2):-
search(N,W,H,Field,[(1,0),(0,1),(-1,0),(0,-1)]
,Pos,Re,AL,EL),adde(Pos,EL,EL1)
,N1 is N-1,heisa(N1,W,H,Field,AL,EL1,EL2).
search(_,_,_,_,[],_,AL,AL,_):-!.
search(N,W,H,Field,[XY|Re],Pos,AL,AL2,EL):-
(X,Y)=Pos,(X1,Y1)=XY,X2 is X+X1,Y2 is Y+Y1
,getv(W,H,X2,Y2,Field,V)
,((nonvar(V);member((X2,Y2),AL);member((X2,Y2),EL))->AL1=AL;adde((X2,Y2),AL,AL1))
,search(N,W,H,Field,Re,Pos,AL1,AL2,EL).
getv(W,H,X,Y,Field,V):-(X>0,Y>0,X=<W,Y=<H)->(Co is (X+(Y-1)*W),arg(Co,Field,V));V=k.
のような形で実現しましたが、汎用的でないようですし、境界条件があとにきているのが気にいりません。
ちなみに、私は切羽詰って、
heisa(0,_,_,_,_,EL,EL):-!.
heisa(_,_,_,_,[],EL,EL):-fail,!.
heisa(N,W,H,Field,[Pos|Re],EL,EL2):-
search(N,W,H,Field,[(1,0),(0,1),(-1,0),(0,-1)]
,Pos,Re,AL,EL),adde(Pos,EL,EL1)
,N1 is N-1,heisa(N1,W,H,Field,AL,EL1,EL2).
search(_,_,_,_,[],_,AL,AL,_):-!.
search(N,W,H,Field,[XY|Re],Pos,AL,AL2,EL):-
(X,Y)=Pos,(X1,Y1)=XY,X2 is X+X1,Y2 is Y+Y1
,getv(W,H,X2,Y2,Field,V)
,((nonvar(V);member((X2,Y2),AL);member((X2,Y2),EL))->AL1=AL;adde((X2,Y2),AL,AL1))
,search(N,W,H,Field,Re,Pos,AL1,AL2,EL).
getv(W,H,X,Y,Field,V):-(X>0,Y>0,X=<W,Y=<H)->(Co is (X+(Y-1)*W),arg(Co,Field,V));V=k.
のような形で実現しましたが、汎用的でないようですし、境界条件があとにきているのが気にいりません。
637デフォルトの名無しさん
2013/02/22(金) 18:46:22.89 % 全然仕上がってないけど、凡そ以下のようなコードとなるはず。
連続している(_色,X1,Y1,X2,Y2) :- 隣接した石がある(_色,X1,Y1,X2,Y2).
連続している(_色,X1,Y1,X2,Y2) :-
隣接した石がある(_色,X1,Y1,X3,Y3),
連続している(_色,X3,Y3,X2,Y2).
隣接した石がある(_色,X1,Y1,X2,Y2) :-
隣接(X1,Y1,X2,Y2),
石(_色,X2,Y2).
隣接(X,Y1,X,Y2) :- 上に隣接(Y1,Y2).
隣接(X,Y1,X,Y2) :- 下に隣接(Y1,Y2).
隣接(X1,Y,X2,Y) :- 右に隣接(X1,X2).
隣接(X1,Y,X2,Y) :- 左に隣接(X1,X2).
上に隣接(Y1,Y2) :- length(L1,Y1),length([_|L1],Y2).
下に隣接(Y1,Y2) :-length(L1,Y1),[_|L2]=L1,\+(L2 = []),length(L2,Y2).
右に隣接(X1,X2) :- length(L1,X1),length([_|L1],X2).
左に隣接(X1,X2) :- length(L1,X1),[_|L2]=L1,\+(L2 = []),length(L2,X2).
連続している(_色,X1,Y1,X2,Y2) :- 隣接した石がある(_色,X1,Y1,X2,Y2).
連続している(_色,X1,Y1,X2,Y2) :-
隣接した石がある(_色,X1,Y1,X3,Y3),
連続している(_色,X3,Y3,X2,Y2).
隣接した石がある(_色,X1,Y1,X2,Y2) :-
隣接(X1,Y1,X2,Y2),
石(_色,X2,Y2).
隣接(X,Y1,X,Y2) :- 上に隣接(Y1,Y2).
隣接(X,Y1,X,Y2) :- 下に隣接(Y1,Y2).
隣接(X1,Y,X2,Y) :- 右に隣接(X1,X2).
隣接(X1,Y,X2,Y) :- 左に隣接(X1,X2).
上に隣接(Y1,Y2) :- length(L1,Y1),length([_|L1],Y2).
下に隣接(Y1,Y2) :-length(L1,Y1),[_|L2]=L1,\+(L2 = []),length(L2,Y2).
右に隣接(X1,X2) :- length(L1,X1),length([_|L1],X2).
左に隣接(X1,X2) :- length(L1,X1),[_|L2]=L1,\+(L2 = []),length(L2,X2).
638デフォルトの名無しさん
2013/02/22(金) 18:57:40.84 升目の数を数える問題ですか。問題をよく読んでいなかった。それだと
バックトラックするとダメなので、再帰で書き直す必要がありますね。
ずっと難しくなりますね。
それから、算数が嫌いなのでY2 is Y1 + 1,を複雑なリスト処理で書きましたが、
単純な算術でもちろん大丈夫です。
バックトラックするとダメなので、再帰で書き直す必要がありますね。
ずっと難しくなりますね。
それから、算数が嫌いなのでY2 is Y1 + 1,を複雑なリスト処理で書きましたが、
単純な算術でもちろん大丈夫です。
639デフォルトの名無しさん
2013/02/22(金) 19:16:47.42640デフォルトの名無しさん
2013/02/22(金) 20:06:38.13 >>634
今、ラッセルやウィトゲンシュタインみたいな分析哲学に凝っているんだけど、
知識の記述に述語論理を使うという前提を共有しているのに、
人工言語派vs.日常言語派みたいな分裂が続くあたり、
何ともいえない不思議さを感じる。
今、ラッセルやウィトゲンシュタインみたいな分析哲学に凝っているんだけど、
知識の記述に述語論理を使うという前提を共有しているのに、
人工言語派vs.日常言語派みたいな分裂が続くあたり、
何ともいえない不思議さを感じる。
641デフォルトの名無しさん
2013/02/22(金) 20:35:52.78 東アジアの農民は、10000年もゆったりした言語で特に深刻に悩むでもなく、
自然と共存したり、痛い目に遭わされながらつぶやいてきた。その延長の言語で
あってよいから、もう少しだけ自分が生きた証しをくっきりとできればいい。
言語に内在するほんの少しの論理性の助けを借りて。だから論理プログラミング。
その程度の論理プログラミング。
自然と共存したり、痛い目に遭わされながらつぶやいてきた。その延長の言語で
あってよいから、もう少しだけ自分が生きた証しをくっきりとできればいい。
言語に内在するほんの少しの論理性の助けを借りて。だから論理プログラミング。
その程度の論理プログラミング。
642デフォルトの名無しさん
2013/02/23(土) 16:24:36.29 論理性の無い文章だなぁ
643デフォルトの名無しさん
2013/03/08(金) 23:47:28.33 Prologでシークエント計算できますか?
644デフォルトの名無しさん
2013/03/09(土) 14:22:50.10 できるけど、50行くらいプログラミングが必要
645デフォルトの名無しさん
2013/03/19(火) 05:22:51.00 wa(you, shock).
646デフォルトの名無しさん
2013/03/20(水) 14:52:27.58 prologのバックトラックを使って
深さ優先探索のミニマックス戦略のプログラムを作れますか。
やむをえなければassert,retractを使ってもかまいません。
幅優先探索ならできるのですが。
深さ優先探索のミニマックス戦略のプログラムを作れますか。
やむをえなければassert,retractを使ってもかまいません。
幅優先探索ならできるのですが。
647デフォルトの名無しさん
2013/03/20(水) 17:44:36.54 >>646
こんな定義になると思う。未定義の部分が多いけれどそのうちに書く。
n手先を評価する(_n,_局面1,_着手ならび,_評価点,_局面) :-
length(Ln,_n),
手を読む(Ln,自分,_局面,[],[],_着手ならび,_評価点,_局面).
手を読む([],_,_局面,_着手ならび,_評価ならび,_着手ならび,_評価点,_局面) :-
sum(_評価ならび,_評価点),!.
手を読む([_|Ln],自分,_局面1,_着手ならび1,_評価ならび1,_着手ならび,_評価点,_局面) :-
findmax([_評価,_着手,_局面2],(
着手(_局面1,_局面2,_着手,評価)),
[_評価,_着手,_局面2]),
手を読む(Ln,相手,_局面2,[_着手|_着手ならび1],[_評価|_評価ならび1],_着手ならび,_評価点,_局面).
手を読む([_|Ln],相手,_局面1,_着手ならび1,_評価ならび1,_着手ならび,_評価点,_局面) :-
findmin([_評価,_着手,_局面2],(
着手(_局面1,_局面2,_着手,評価)),
[_評価,_着手,_局面2]),
手を読む(Ln,自分,_局面2,[_着手|_着手ならび1],[_評価|_評価ならび1],_着手ならび,_評価点,_局面).
着手(_局面1,_局面2,_着手,_評価) :-
着手の選択(_局面1,_局面2,_着手),
局面の評価(_局面2,_評価).
こんな定義になると思う。未定義の部分が多いけれどそのうちに書く。
n手先を評価する(_n,_局面1,_着手ならび,_評価点,_局面) :-
length(Ln,_n),
手を読む(Ln,自分,_局面,[],[],_着手ならび,_評価点,_局面).
手を読む([],_,_局面,_着手ならび,_評価ならび,_着手ならび,_評価点,_局面) :-
sum(_評価ならび,_評価点),!.
手を読む([_|Ln],自分,_局面1,_着手ならび1,_評価ならび1,_着手ならび,_評価点,_局面) :-
findmax([_評価,_着手,_局面2],(
着手(_局面1,_局面2,_着手,評価)),
[_評価,_着手,_局面2]),
手を読む(Ln,相手,_局面2,[_着手|_着手ならび1],[_評価|_評価ならび1],_着手ならび,_評価点,_局面).
手を読む([_|Ln],相手,_局面1,_着手ならび1,_評価ならび1,_着手ならび,_評価点,_局面) :-
findmin([_評価,_着手,_局面2],(
着手(_局面1,_局面2,_着手,評価)),
[_評価,_着手,_局面2]),
手を読む(Ln,自分,_局面2,[_着手|_着手ならび1],[_評価|_評価ならび1],_着手ならび,_評価点,_局面).
着手(_局面1,_局面2,_着手,_評価) :-
着手の選択(_局面1,_局面2,_着手),
局面の評価(_局面2,_評価).
648647
2013/03/20(水) 18:04:57.94 そうか。
これだと、最善手をn手続けてみただけか。
一手目を非決定性に着手してn手先まで最善手で読ませて、すべての着手を
評価して、評価点がもっとも高い着手を選ぶようにしないといけないか。
これだと、最善手をn手続けてみただけか。
一手目を非決定性に着手してn手先まで最善手で読ませて、すべての着手を
評価して、評価点がもっとも高い着手を選ぶようにしないといけないか。
649デフォルトの名無しさん
2013/03/20(水) 18:25:18.12 >>647,648
深さ優先ですから、とりあえずある道筋で、最終局面まで行き、
そこで評価点を決め、それをひとつ下のレベルに下ろしておいて、
また別の最終局面に行って評価点を求め、其れを先ほどの値と比較し、
最終局面がなくなったら更に一つ下のレベルと比較......
のようなことを繰り返し、次第にレベルを下げていくことになるはずですが、
バックトラックをうまく制御できません。
深さ優先ですから、とりあえずある道筋で、最終局面まで行き、
そこで評価点を決め、それをひとつ下のレベルに下ろしておいて、
また別の最終局面に行って評価点を求め、其れを先ほどの値と比較し、
最終局面がなくなったら更に一つ下のレベルと比較......
のようなことを繰り返し、次第にレベルを下げていくことになるはずですが、
バックトラックをうまく制御できません。
650647
2013/03/20(水) 18:45:14.17 >>649
深さ優先といっても株は全部評価しないとどれが最高評価点かが
分かりません。それで最高点-最低点-最高点...と降りていって、
葉までたどり着いたら(つまりn手先)一つ候補が決まる。次善候補を
葉のレベルの次の評価点の候補着手とするという意味ですか?
深さ優先といっても株は全部評価しないとどれが最高評価点かが
分かりません。それで最高点-最低点-最高点...と降りていって、
葉までたどり着いたら(つまりn手先)一つ候補が決まる。次善候補を
葉のレベルの次の評価点の候補着手とするという意味ですか?
651デフォルトの名無しさん
2013/03/20(水) 19:12:35.16 >>650
理屈からいうと、N手目の局面で評価するとすると、
あるN-1手目から派生するN手目の評価点を全て比較して、
其れをN-1手目の評価点とし、同様にあるN-2手目から派生する
全てのN-1手目について評価点を決めて其れを比較して
N-2手目の評価点として........というように、
だんだん一手目まで戻っていきます。
(もちろんmini とmax交互に)
これを、同じレベルの評価をfindall等を使っていっぺんに行うと
幅優先になり、行ったりきたりして評価すると深さ優先になります。
1->N->N-1->N->N-1->N->N-1->N-2->N-1->N->N-1->N->N-1->N-2........
というような感じだと思います。.
理屈からいうと、N手目の局面で評価するとすると、
あるN-1手目から派生するN手目の評価点を全て比較して、
其れをN-1手目の評価点とし、同様にあるN-2手目から派生する
全てのN-1手目について評価点を決めて其れを比較して
N-2手目の評価点として........というように、
だんだん一手目まで戻っていきます。
(もちろんmini とmax交互に)
これを、同じレベルの評価をfindall等を使っていっぺんに行うと
幅優先になり、行ったりきたりして評価すると深さ優先になります。
1->N->N-1->N->N-1->N->N-1->N-2->N-1->N->N-1->N->N-1->N-2........
というような感じだと思います。.
652デフォルトの名無しさん
2013/03/20(水) 21:31:55.30653デフォルトの名無しさん
2013/03/20(水) 23:01:45.80654デフォルトの名無しさん
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).
この制御のためのカットも他に手がない。
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を代表するものに成長しているの
だから、この部分に人を割いて欲しい。
850デフォルトの名無しさん
2016/12/11(日) 00:28:21.45ID:JXdY8Uy9 そこまでPrologに肩入れする理由は何?
851デフォルトの名無しさん
2016/12/16(金) 12:14:52.67ID:tlYBnfBK >>846
atom_concatつかうのはどうですか?
9 ?- readln(X),X=[First|[Rest]],atom_concat(First,Rest,Out).
|: abc def
X = [abc, def],
First = abc,
Rest = def,
Out = abcdef.
atom_concatつかうのはどうですか?
9 ?- readln(X),X=[First|[Rest]],atom_concat(First,Rest,Out).
|: abc def
X = [abc, def],
First = abc,
Rest = def,
Out = abcdef.
852デフォルトの名無しさん
2016/12/16(金) 16:28:14.37ID:JsK6rGFf >>851
ありがとうございます。
基本的にそれでうまく行くことも多いのだけれど、
入力したままの文字列にならないという点で具合が悪い。空白が必ずひとつならば、
atomic_list_concat(X,' ',Out),
良いのだが、そうとは限らない。
ありがとうございます。
基本的にそれでうまく行くことも多いのだけれど、
入力したままの文字列にならないという点で具合が悪い。空白が必ずひとつならば、
atomic_list_concat(X,' ',Out),
良いのだが、そうとは限らない。
853デフォルトの名無しさん
2016/12/16(金) 17:19:33.35ID:wFVtPzZ+854デフォルトの名無しさん
2016/12/19(月) 17:20:34.24ID:HSp2u2Qk >>850
他の言語には難しい表現が可能になるから。
他の言語には難しい表現が可能になるから。
855デフォルトの名無しさん
2016/12/22(木) 23:10:05.00ID:LlPiHmas Lispの演習でユニフィケーションを実装すると、Prologがクセになる
マジおすすめ
マジおすすめ
856デフォルトの名無しさん
2017/01/22(日) 05:48:37.87ID:2Nn7VwOW 昨日ツイッターで出てきた。
即是(色,空).
という定義。これひとつで、
空 色
即 即
是 是
色 空
を満たしているのではないかと。
即是(色,空).
という定義。これひとつで、
空 色
即 即
是 是
色 空
を満たしているのではないかと。
857デフォルトの名無しさん
2017/01/22(日) 06:07:17.17ID:2Nn7VwOW Tiobe Index for January 2017 Very Long Term History
Programming Language 2017 2012 2007 2002 1997 1992 1987
Java 1 1 1 2 17 - -
C 2 2 2 1 1 1 1
C++ 3 3 3 3 2 2 4
C# 4 4 6 10 - - -
Python 5 7 7 16 27 - -
PHP 6 5 4 6 - - -
JavaScript 7 9 8 7 20 - -
Visual Basic .NET 8 24 - - - - -
Perl 9 8 5 4 3 - -
Assembly language 10 - - - - - -
Lisp 28 12 12 9 7 11 2
Ada 30 15 16 15 10 3 13
Prolog 33 43 27 27 14 9 3
Prologもメジャーだった。
Programming Language 2017 2012 2007 2002 1997 1992 1987
Java 1 1 1 2 17 - -
C 2 2 2 1 1 1 1
C++ 3 3 3 3 2 2 4
C# 4 4 6 10 - - -
Python 5 7 7 16 27 - -
PHP 6 5 4 6 - - -
JavaScript 7 9 8 7 20 - -
Visual Basic .NET 8 24 - - - - -
Perl 9 8 5 4 3 - -
Assembly language 10 - - - - - -
Lisp 28 12 12 9 7 11 2
Ada 30 15 16 15 10 3 13
Prolog 33 43 27 27 14 9 3
Prologもメジャーだった。
858デフォルトの名無しさん
2017/01/23(月) 18:21:28.72ID:ldBFD7Ci859デフォルトの名無しさん
2017/02/02(木) 09:31:31.52ID:iNuMzBgW860859
2017/02/02(木) 09:33:43.86ID:iNuMzBgW ごめんなさい。
行入力(_行) :- readline_to_codes(current_input,Codes),atom_codes(_行,Codes).
です。
行入力(_行) :- readline_to_codes(current_input,Codes),atom_codes(_行,Codes).
です。
861デフォルトの名無しさん
2017/02/02(木) 09:40:23.12ID:zsLWsToR862デフォルトの名無しさん
2017/02/02(木) 09:44:53.78ID:iNuMzBgW863デフォルトの名無しさん
2017/02/02(木) 09:48:41.37ID:iNuMzBgW ところで、
『Prologでまったり』スレ
復活したいですね。
『Prologでまったり』スレ
復活したいですね。
864デフォルトの名無しさん
2017/02/02(木) 17:03:13.44ID:vNnAnK3G Alephなどの帰納論理ライブラリ使ってる方はいるんだろうか。話聞いてみたい。
865デフォルトの名無しさん
2017/02/06(月) 11:47:26.15ID:zsAHJXs9866デフォルトの名無しさん
2017/02/06(月) 18:10:43.59ID:rCI9uCRE867デフォルトの名無しさん
2017/02/07(火) 18:24:31.96ID:s4l5/kyE 最近Stringが使われているコードあまり見なくなりましたね。
関数名、述語名もアトムですから。アトムとして処理したいです。
sub_atom/5やatom_concat/3が強力であることもあって、文字コードが
出る幕はなくなったということでしょう。
read_line・・・ については何故かどちらも文字コードが来るのですが。
関数名、述語名もアトムですから。アトムとして処理したいです。
sub_atom/5やatom_concat/3が強力であることもあって、文字コードが
出る幕はなくなったということでしょう。
read_line・・・ については何故かどちらも文字コードが来るのですが。
868867
2017/02/07(火) 18:26:48.89ID:s4l5/kyE read_line_to_chars/2でよいと思うのですが何故_to_codesしかないのでしょうか。
869デフォルトの名無しさん
2017/02/08(水) 08:17:30.17ID:ic0Hb1Oc なぜ、Prologの世界で、これを標準ライブラリ化しなかったのか。
そのことの理解が必要なんだろうけれど。以下はどうしても必要だろう。
行入力(_入力ストリーム,_行) :-
read_line_to_code(_入力ストリーム,Codes),
atom_codes(_行,Codes).
そのことの理解が必要なんだろうけれど。以下はどうしても必要だろう。
行入力(_入力ストリーム,_行) :-
read_line_to_code(_入力ストリーム,Codes),
atom_codes(_行,Codes).
870デフォルトの名無しさん
2017/02/13(月) 13:15:20.36ID:Bz9CPtSy >>865
はい、Alephはprologで書かれています。
http://www.cs.ox.ac.uk/activities/machinelearning/Aleph/aleph
自分は「Prolog Programming for Artificial Intelligence 4th Edition」の
Inductive Logic Programing(帰納論理プログラミング)の記事を読んで興味を持ったのですが、
この本で紹介されているコードを大分レベルアップしたのがAlephやProgolのように感じました。
自分もまだ勉強中ですが、例えば以下の問題など興味深いです。
has_daughter述語の学習
parent(X,Y):XはYの親、 female(X):Xは女性、という既存の述語があったとして、
has_daughter(X)というボディ部不明の述語があり、
これを満たす例、満たさない例をたくさん与えると、
has_daughterのボディ部の内容の仮定を生成する
列車のeastbound-westbound問題(有名な問題のようです)
これこれの構成で積荷がこれこれの列車は東行き、これこれだと西行きという事例を沢山学習させ、
任意の構成の列車を入力するとそれが西行きか東行きかを生成した仮定を用いて判定する
はい、Alephはprologで書かれています。
http://www.cs.ox.ac.uk/activities/machinelearning/Aleph/aleph
自分は「Prolog Programming for Artificial Intelligence 4th Edition」の
Inductive Logic Programing(帰納論理プログラミング)の記事を読んで興味を持ったのですが、
この本で紹介されているコードを大分レベルアップしたのがAlephやProgolのように感じました。
自分もまだ勉強中ですが、例えば以下の問題など興味深いです。
has_daughter述語の学習
parent(X,Y):XはYの親、 female(X):Xは女性、という既存の述語があったとして、
has_daughter(X)というボディ部不明の述語があり、
これを満たす例、満たさない例をたくさん与えると、
has_daughterのボディ部の内容の仮定を生成する
列車のeastbound-westbound問題(有名な問題のようです)
これこれの構成で積荷がこれこれの列車は東行き、これこれだと西行きという事例を沢山学習させ、
任意の構成の列車を入力するとそれが西行きか東行きかを生成した仮定を用いて判定する
871デフォルトの名無しさん
2017/02/15(水) 19:36:40.66ID:Hii7olK0 >>865
ちょっと遅くなりました。帰納論理プログラミングについては、魅力的ですし、
将来、重要な地歩を占めるものと、予感しています。Progolについては、
大量に現れる節の可能性を上手く排除できず、中断状態になったままです。
この機会にAlephやってみます。どうも有難うございました。
ちょっと遅くなりました。帰納論理プログラミングについては、魅力的ですし、
将来、重要な地歩を占めるものと、予感しています。Progolについては、
大量に現れる節の可能性を上手く排除できず、中断状態になったままです。
この機会にAlephやってみます。どうも有難うございました。
873デフォルトの名無しさん
2017/02/16(木) 11:41:51.71ID:sX4bqSJb 何で急にprolog流行り出したの?
874870
2017/02/16(木) 12:18:29.03ID:wak87cl1 >>873
自分はProlog大好きなのですが全然流行っていないような…情報集めもメッチャ苦労しますし…
Prologの基本文法以外の、論文とかでしかあまり目にしない「応用Prolog」みたいな領域があって「日本ではあまり目立たなかったけど実は少しづつ進化していた」というのはあると思います。
日本語で目にするPrologの基本文法レベルの情報と外国で見つかる応用Prologの情報には大分差があるというのはあると思います。
文法にも大分手が入っている印象です
自分はProlog大好きなのですが全然流行っていないような…情報集めもメッチャ苦労しますし…
Prologの基本文法以外の、論文とかでしかあまり目にしない「応用Prolog」みたいな領域があって「日本ではあまり目立たなかったけど実は少しづつ進化していた」というのはあると思います。
日本語で目にするPrologの基本文法レベルの情報と外国で見つかる応用Prologの情報には大分差があるというのはあると思います。
文法にも大分手が入っている印象です
875デフォルトの名無しさん
2017/02/16(木) 21:41:14.28ID:Ip3bwl24 >>873
どっかの大学で処理系作る演習課題を出したのでは
どっかの大学で処理系作る演習課題を出したのでは
876デフォルトの名無しさん
2017/02/16(木) 23:14:34.57ID:suS7noGe877デフォルトの名無しさん
2017/02/17(金) 00:34:53.19ID:nT+0Ed8G Prologって、第5世代コンピュータをつくるとかいって、ICOTという組織を
作って大々的に研究していたのじゃなかったかな。
ICOTの成果というものは、発表さいているのかしら。
作って大々的に研究していたのじゃなかったかな。
ICOTの成果というものは、発表さいているのかしら。
878デフォルトの名無しさん
2017/02/17(金) 03:22:48.78ID:td9uOFbw 発表されてたはずで、
https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%BA%94%E4%B8%96%E4%BB%A3%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF
の外部リンク
AITEC・ICOTアーカイブス
第五世代コンピュータ プロジェクト アーカイブ
の先にあったのだと思うけど今では 403 Forbidden と 404 Not Found
これは残ってた
第五世代コンピュータ・プロジェクト
最終評価報告書
http://www.jipdec.or.jp/archives/publications/J0005062
https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%BA%94%E4%B8%96%E4%BB%A3%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF
の外部リンク
AITEC・ICOTアーカイブス
第五世代コンピュータ プロジェクト アーカイブ
の先にあったのだと思うけど今では 403 Forbidden と 404 Not Found
これは残ってた
第五世代コンピュータ・プロジェクト
最終評価報告書
http://www.jipdec.or.jp/archives/publications/J0005062
879デフォルトの名無しさん
2017/02/17(金) 05:29:01.81ID:zgDgwzIu >>877-878
プロジェクトの遺産であるKLICはメンテナンスされている。
並行論理プログラミング (KLIC version 3.01)
http://www.ueda.info.waseda.ac.jp/software-j.html
けいえるわん
http://www.ueda.info.waseda.ac.jp/~takagi/kl1/
並列論理型言語処理系 KLIC のページ
http://web.archive.org/web/20100815015107/http://www.klic.org/software/klic/index.ja.html
第五世代コンピュータ プロジェクト アーカイブ
http://web.archive.org/web/20150121033015/http://www.jipdec.or.jp/archives/icot/ARCHIVE/HomePage-J.html
プロジェクトの遺産であるKLICはメンテナンスされている。
並行論理プログラミング (KLIC version 3.01)
http://www.ueda.info.waseda.ac.jp/software-j.html
けいえるわん
http://www.ueda.info.waseda.ac.jp/~takagi/kl1/
並列論理型言語処理系 KLIC のページ
http://web.archive.org/web/20100815015107/http://www.klic.org/software/klic/index.ja.html
第五世代コンピュータ プロジェクト アーカイブ
http://web.archive.org/web/20150121033015/http://www.jipdec.or.jp/archives/icot/ARCHIVE/HomePage-J.html
881デフォルトの名無しさん
2017/02/17(金) 15:48:47.57ID:ovwqcfrF 残念…
https://ja.wikipedia.org/wiki/Prolog
>Prolog にオブジェクト指向プログラミングを取り入れた ESP
(略)
>ESPは多重継承を特徴とする当時としては先鋭のオブジェクト指向言語であった
(略)
>ISO の標準化作業は1987年頃から作業委員会(WG17)が作られ、
>日本委員も情報処理学会から15名ほどがこれに加わった。
(略)
>モジュール仕様については日本委員から、ICOTによって作成された
>ESP(Extended Self-contained Prolog)を以てその標準とする案が出されていたが、
>これは否決された。
https://ja.wikipedia.org/wiki/Prolog
>Prolog にオブジェクト指向プログラミングを取り入れた ESP
(略)
>ESPは多重継承を特徴とする当時としては先鋭のオブジェクト指向言語であった
(略)
>ISO の標準化作業は1987年頃から作業委員会(WG17)が作られ、
>日本委員も情報処理学会から15名ほどがこれに加わった。
(略)
>モジュール仕様については日本委員から、ICOTによって作成された
>ESP(Extended Self-contained Prolog)を以てその標準とする案が出されていたが、
>これは否決された。
882デフォルトの名無しさん
2017/03/08(水) 01:37:14.82ID:FH5JSwpU http://qiita.com/ShunIchikawa/items/6449f492dc38a7201162
pepperの頭脳がprologで書かれていたなんて
pepperの頭脳がprologで書かれていたなんて
883デフォルトの名無しさん
2017/03/20(月) 14:40:29.09ID:D+qAvvKH884デフォルトの名無しさん
2017/03/21(火) 02:02:37.80ID:1B8bXLyp 今のままでは、小学校のプログラミング教育にScratchが導入されてしまう。
Prologを推すことができるように、
小学生の目線で書いたPrologプログラムを増やそう。
Prologを推すことができるように、
小学生の目線で書いたPrologプログラムを増やそう。
885デフォルトの名無しさん
2017/03/21(火) 02:08:37.78ID:1B8bXLyp 基本的な方針としては、
道具立てなく、現在の授業科目の中ですぐに利用できるプログラム言語で
あることを武器として、広めていく。
もちろん、環境整備は必要だし、Prologの言語仕様の一部変更も必要には
なるだろう。
道具立てなく、現在の授業科目の中ですぐに利用できるプログラム言語で
あることを武器として、広めていく。
もちろん、環境整備は必要だし、Prologの言語仕様の一部変更も必要には
なるだろう。
886デフォルトの名無しさん
2017/03/25(土) 04:56:52.06ID:GDunSt8n887デフォルトの名無しさん
2017/03/26(日) 18:38:57.42ID:AnJi4Uz+888887
2017/03/26(日) 18:41:31.41ID:AnJi4Uz+ 訂正。
・・・・・・・
それを補う部分の記述が必要。その部分では最有力ということではないか。
・・・・・・・
それを補う部分の記述が必要。その部分では最有力ということではないか。
889デフォルトの名無しさん
2017/03/27(月) 09:23:14.55ID:0S3+JQEx >>886
読み書きしにくいの意味が、データの入出力のことなら別だけれど
プログラムの読みやすさ、書きやすさの意味だとすると、
Prologはもっとも読みやすいプログラム言語のひとつではないか
書く方は、難しいという見方もできるだろうが
読み書きしにくいの意味が、データの入出力のことなら別だけれど
プログラムの読みやすさ、書きやすさの意味だとすると、
Prologはもっとも読みやすいプログラム言語のひとつではないか
書く方は、難しいという見方もできるだろうが
890デフォルトの名無しさん
2017/03/31(金) 12:48:26.56ID:9hE01YVS >>887
その部分では関数型言語も手続型言語もオブジェクト指向が強調されたものでも記述できるが、その記述の簡潔さでは、Prologは一頭地抜けている
その部分では関数型言語も手続型言語もオブジェクト指向が強調されたものでも記述できるが、その記述の簡潔さでは、Prologは一頭地抜けている
891デフォルトの名無しさん
2017/03/31(金) 16:20:13.33ID:Xm1Y4uex892891
2017/03/31(金) 16:21:47.69ID:Xm1Y4uex 「ニューラルネットワーク的AIを統制するためのPrologプログラミング」かな。
893デフォルトの名無しさん
2017/04/09(日) 08:47:47.54ID:w11Bnd9f Emacsでプログラム書いてますか?設定の参考になるサイトとかないでしょうか
894デフォルトの名無しさん
2017/06/15(木) 07:05:22.75ID:OS4b1hKm Prologでデータベース foo/1 の引数値を集約するときに
?- findall(N,foo(N),L),sum_list(N,Sum).
というように書きます。これを
?- findall(Sum_1,(
findnsols(1000,N,foo(N),L1),
sum_list(L1,Sum_1)),L2),
sum_list(L2,Sum).
というように書くとスタックの消費を抑えることがてきます。
?- findall(N,foo(N),L),sum_list(N,Sum).
というように書きます。これを
?- findall(Sum_1,(
findnsols(1000,N,foo(N),L1),
sum_list(L1,Sum_1)),L2),
sum_list(L2,Sum).
というように書くとスタックの消費を抑えることがてきます。
895デフォルトの名無しさん
2017/06/20(火) 18:05:00.63ID:K8Mc93da896デフォルトの名無しさん
2017/06/23(金) 08:01:15.35ID:oZciV1Hy そうそうProlog読み書きしにくいから
基本はPythonメインで
論理プログラムがハマるところに
Prolog使いたいよね
でも連携というかそもそも
Prolog自体の情報が少ない
基本はPythonメインで
論理プログラムがハマるところに
Prolog使いたいよね
でも連携というかそもそも
Prolog自体の情報が少ない
897デフォルトの名無しさん
2017/06/25(日) 17:00:13.26ID:NUFQhX60 人工知能ということになるとPrologは述語論理を担うなどと大仰な
ことになるが、もっと単純に、
自分はこういうことを望む。
これこれのことはするな。
というように比較的単純なしかしどうしても欠かせない情報を
確実に表現するためのもの。Pythonよりさらに簡素な記述系を
最大限に使い込もう。
ことになるが、もっと単純に、
自分はこういうことを望む。
これこれのことはするな。
というように比較的単純なしかしどうしても欠かせない情報を
確実に表現するためのもの。Pythonよりさらに簡素な記述系を
最大限に使い込もう。
898デフォルトの名無しさん
2017/06/27(火) 11:15:02.78ID:TURdRN9F 実行系をさらにその上位で制御するという役割にPrologのようなプログラム言語は当てられてよいはずだが<
案外とそういうコードがない。GeneXusなどもそういう切り口を残すべきだったのだろうけれど、現在のところそうなっていない。
案外とそういうコードがない。GeneXusなどもそういう切り口を残すべきだったのだろうけれど、現在のところそうなっていない。
899デフォルトの名無しさん
2017/06/27(火) 22:09:52.04ID:yIuIIYT1 Prologは宣言型なので
Pythonなどの命令型言語よりさらに高水準だから
システム最上位の制御にふさわしい……
って理屈は分かるけど
実際にはそういう使われ方で普及してないよね?
関数型言語よりもっと簡潔だけどもっと難しいんじゃ
やっぱ日常的に使いにくいんだと思う
Pythonなどの命令型言語よりさらに高水準だから
システム最上位の制御にふさわしい……
って理屈は分かるけど
実際にはそういう使われ方で普及してないよね?
関数型言語よりもっと簡潔だけどもっと難しいんじゃ
やっぱ日常的に使いにくいんだと思う
900デフォルトの名無しさん
2017/07/02(日) 09:20:29.55ID:+SxSuJIi >>899
どこも使い難い点はないような
どこも使い難い点はないような
901デフォルトの名無しさん
2017/07/03(月) 05:36:37.05ID:JEoPVY0x >>900
それ、使い込んだ上での話ですか
それ、使い込んだ上での話ですか
902デフォルトの名無しさん
2017/07/03(月) 07:01:23.77ID:6QSWtKdI >>896
ディープラーニンングは一過性ではなく持続しそうだから今後益々
数値計算依存部分はPytho、シンボル依存部分はPrologの切り分けが
進む。メインはPrologではあるが、スクリプト的なものが多くなる。
ディープラーニンングは一過性ではなく持続しそうだから今後益々
数値計算依存部分はPytho、シンボル依存部分はPrologの切り分けが
進む。メインはPrologではあるが、スクリプト的なものが多くなる。
903デフォルトの名無しさん
2017/08/02(水) 12:14:45.53ID:AyM7Pnm7 >>900
PrologとPythonなどとの連携部分はまだ課題が多い。
単に呼べるというのでは不十分で、「簡単にどのライブラリ間でもいじること無く呼べる」必要がある。
例えば、C++がいま一つ敬遠される理由はこの連携が弱い(ABIが乱立)からだし。
まあこの手の問題は、糊(glue)機能が比較的優れてるLispでも抱えてる問題ではあるが。
PrologとPythonなどとの連携部分はまだ課題が多い。
単に呼べるというのでは不十分で、「簡単にどのライブラリ間でもいじること無く呼べる」必要がある。
例えば、C++がいま一つ敬遠される理由はこの連携が弱い(ABIが乱立)からだし。
まあこの手の問題は、糊(glue)機能が比較的優れてるLispでも抱えてる問題ではあるが。
904デフォルトの名無しさん
2017/11/07(火) 17:33:56.45ID:cG+teg8q 904
905デフォルトの名無しさん
2017/11/07(火) 17:34:27.71ID:cG+teg8q 905
906デフォルトの名無しさん
2017/11/07(火) 17:34:59.61ID:cG+teg8q 906
907デフォルトの名無しさん
2017/11/07(火) 17:35:31.12ID:cG+teg8q 907
908デフォルトの名無しさん
2017/11/07(火) 17:36:01.37ID:cG+teg8q 908
909デフォルトの名無しさん
2017/11/07(火) 17:36:30.51ID:cG+teg8q 909
910デフォルトの名無しさん
2017/11/07(火) 17:37:00.33ID:cG+teg8q 910
911デフォルトの名無しさん
2017/11/07(火) 17:37:34.15ID:cG+teg8q 911
912デフォルトの名無しさん
2017/11/07(火) 17:37:57.03ID:cG+teg8q 912
913デフォルトの名無しさん
2017/11/07(火) 17:38:26.67ID:cG+teg8q 913
914デフォルトの名無しさん
2017/11/07(火) 21:52:44.42ID:Yiwwf3oY 埋め立て荒らし死ね
915デフォルトの名無しさん
2017/11/08(水) 23:59:56.10ID:RoSi+77P916デフォルトの名無しさん
2018/05/23(水) 21:19:05.66ID:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
26K6I
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
26K6I
917デフォルトの名無しさん
2018/07/05(木) 00:38:42.64ID:RfoszcD2 N2H
918デフォルトの名無しさん
2018/07/11(水) 05:18:17.41ID:WcC1XiNM prolog初心者でわからないことあったから来てみたけどもしかして誰もいない?
919デフォルトの名無しさん
2018/07/11(水) 12:16:27.45ID:E99jt7Z3 眠ってなんかいません
920デフォルトの名無しさん
2018/07/11(水) 13:51:36.30ID:wV7UrnIg >918
そのわからないことを質問してみたらいいのじゃないかな
そのわからないことを質問してみたらいいのじゃないかな
921デフォルトの名無しさん
2018/07/12(木) 20:27:33.93ID:G0bLrcU2 >920
構文木を例のように見やすくするプログラムを書きたいんだけどそれがわからなく、
ggっても全然出てこなくて困ってる
例
文(
主語(
名詞句(
名詞句(
名詞(鳥))
主格助詞(は)))
述語(
目的語(
名詞句(
形容詞(白い)
名詞句(
名詞(花))))
対象格助詞(を)
動詞(好む)))
構文木を例のように見やすくするプログラムを書きたいんだけどそれがわからなく、
ggっても全然出てこなくて困ってる
例
文(
主語(
名詞句(
名詞句(
名詞(鳥))
主格助詞(は)))
述語(
目的語(
名詞句(
形容詞(白い)
名詞句(
名詞(花))))
対象格助詞(を)
動詞(好む)))
922デフォルトの名無しさん
2018/07/12(木) 20:29:25.40ID:G0bLrcU2 >921
)の数ミスった
)の数ミスった
923デフォルトの名無しさん
2018/07/12(木) 20:37:01.43ID:G0bLrcU2 >920
連投ごめんなさい 構文木ってのがこれ 構文木じゃなくて構文木を表す項っていうのかな
文(主語(名詞句(名詞(鳥),主格助詞(は))),述語(目的語(名詞句(形容詞(白い)名詞(花)),対象格助詞(を))),動詞(好む))).
連投ごめんなさい 構文木ってのがこれ 構文木じゃなくて構文木を表す項っていうのかな
文(主語(名詞句(名詞(鳥),主格助詞(は))),述語(目的語(名詞句(形容詞(白い)名詞(花)),対象格助詞(を))),動詞(好む))).
924デフォルトの名無しさん
2018/07/14(土) 10:54:39.64ID:v4Gtt50J そんなのggれないやつは向いてない
925デフォルトの名無しさん
2018/08/27(月) 13:27:28.56ID:2QrJXX5D Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.6.6)
?- [user].
|: 死ぬ(人間).
|: member(ソクラテス, 人間).
|: % user://1 compiled 0.00 sec, 3 clauses
true.
?- 死ぬ(ソクラテス).
false.
なんでtrueにならないんでしょ?
?- [user].
|: 死ぬ(人間).
|: member(ソクラテス, 人間).
|: % user://1 compiled 0.00 sec, 3 clauses
true.
?- 死ぬ(ソクラテス).
false.
なんでtrueにならないんでしょ?
926デフォルトの名無しさん
2018/08/31(金) 15:46:52.79ID:xstmO6GY Prolog、難しすぎる(~o~)
927デフォルトの名無しさん
2019/06/19(水) 04:54:52.34ID:tVNS+22r 【出資】松本卓朗 人工知能詐欺【注意】
https://rio2016.5ch.net/test/read.cgi/rikei/1560859403/
https://rio2016.5ch.net/test/read.cgi/rikei/1560859403/
928デフォルトの名無しさん
2019/10/22(火) 18:08:22.23ID:ng/45f9q 最近Prologを学び始めたのですが、ゴール(目標)について質問があります。教えてください
例えばwikipedia<https://ja.wikipedia.org/wiki/Prolog>などで、
> 目標 = ( 副目標1,副目標2, ... 副目標n ) と置けば、
> 頭部 :- 目標.
というような説明になっているのですが、
『Prologへの入門』だと、
> システムへの質問は1つまたは複数の目標(goal)から成る.
> parent( X, ann), parent( X, pat)
> のような目標の列は
> XがAnnの親であり、かつXがPatの親である
> という目標の連言(conjunction)を意味する.
となってますし、The Art of Prologでも
> An important extension to the queries discussed so far is conjunctive
> queries. Conjunctive queries are a conjunction of goals posed as a query,
> for example, f ather(terach,X) ,father(X,Y)? or in general, Q1, ..., Qn.
となっていて、一番上の引用における「副目標」のことをgola(目標)と呼んでいる
ように思われるのですが、私の理解が間違ってるのでしょうか
それとも、Prolog界で定義というか捉え方が変わったのでしょうか
例えばwikipedia<https://ja.wikipedia.org/wiki/Prolog>などで、
> 目標 = ( 副目標1,副目標2, ... 副目標n ) と置けば、
> 頭部 :- 目標.
というような説明になっているのですが、
『Prologへの入門』だと、
> システムへの質問は1つまたは複数の目標(goal)から成る.
> parent( X, ann), parent( X, pat)
> のような目標の列は
> XがAnnの親であり、かつXがPatの親である
> という目標の連言(conjunction)を意味する.
となってますし、The Art of Prologでも
> An important extension to the queries discussed so far is conjunctive
> queries. Conjunctive queries are a conjunction of goals posed as a query,
> for example, f ather(terach,X) ,father(X,Y)? or in general, Q1, ..., Qn.
となっていて、一番上の引用における「副目標」のことをgola(目標)と呼んでいる
ように思われるのですが、私の理解が間違ってるのでしょうか
それとも、Prolog界で定義というか捉え方が変わったのでしょうか
929デフォルトの名無しさん
2019/10/22(火) 18:11:40.32ID:ng/45f9q930デフォルトの名無しさん
2019/10/22(火) 21:34:35.60ID:QfoZv31s931928
2019/10/22(火) 22:03:20.92ID:ng/45f9q うーん 沢山のゴールの中の「上位」なものを「副」と名付けるとは思えませんが
「目標」が「goal」の訳だとすると、「目標」の上位なものを「副目標」と呼び、副目標の並びを
また「目標」と呼ぶということになってしまいます
「目標」が「goal」の訳だとすると、「目標」の上位なものを「副目標」と呼び、副目標の並びを
また「目標」と呼ぶということになってしまいます
932デフォルトの名無しさん
2019/10/22(火) 22:32:54.50ID:QfoZv31s >>931
書き方が悪かったかな
上位のgoalを構成する部分要素になってるgoalをsubgoalと呼んでるってこと
subgoalもgoal。goalという概念のうち特化したものをsubgoalと呼んでる。
subを強調したいかどうかで書き手が使い分けてるだけ
書き方が悪かったかな
上位のgoalを構成する部分要素になってるgoalをsubgoalと呼んでるってこと
subgoalもgoal。goalという概念のうち特化したものをsubgoalと呼んでる。
subを強調したいかどうかで書き手が使い分けてるだけ
933928
2019/10/23(水) 21:19:52.08ID:9WlWgYr4 確かに「goalを並べてもgoal」という定義はありだと思いますが、目標という言葉が
「副目標」がたくさん出現した後で「頭部 :- 目標.」で初めて出てくるのはどうなんだろうと
いう思いを禁じえません。。
ともあれ、ちょっとすっきりしました
ありがとうございました
「副目標」がたくさん出現した後で「頭部 :- 目標.」で初めて出てくるのはどうなんだろうと
いう思いを禁じえません。。
ともあれ、ちょっとすっきりしました
ありがとうございました
934デフォルトの名無しさん
2020/03/05(木) 20:08:15.95ID:h922Dn8C ひとつ前は去年のレスか……
このスレもゴールしそうだな?
このスレもゴールしそうだな?
935デフォルトの名無しさん
2020/06/04(木) 14:22:16.50ID:fpPgT8jn Prologを使えばオートマトンが簡単に実装出来るな
文法自由文法に相当することも出来るみたいだが詳しいことを教えてくれ
あと、Prologの文法を色々拡張しようと思ってswi-prolog本体のソースコードを読んでるから情報交換頼む
文法自由文法に相当することも出来るみたいだが詳しいことを教えてくれ
あと、Prologの文法を色々拡張しようと思ってswi-prolog本体のソースコードを読んでるから情報交換頼む
936デフォルトの名無しさん
2020/06/04(木) 14:39:49.15ID:fpPgT8jn swi-prolog本体のソース読んでるんだが
__cyg_profile_func_enter使ってswi-prologの関数トレースしようと思ったら出来ないなーと思ったらvisibility("hidden")のattributeが設定されてたw
取りあえず一括置換したわw
Prologって文法がシンプルだからインタープリターのソースも15万ステップぐらいしかないし、実用的な言語実装の勉強になる
さらに汎用言語と組み合わせて使えば構造化データのマッチングなんかで強力な武器になるしいい言語だな!
皆んなでインタープリターのソース読んでProlog広めようぜ!
__cyg_profile_func_enter使ってswi-prologの関数トレースしようと思ったら出来ないなーと思ったらvisibility("hidden")のattributeが設定されてたw
取りあえず一括置換したわw
Prologって文法がシンプルだからインタープリターのソースも15万ステップぐらいしかないし、実用的な言語実装の勉強になる
さらに汎用言語と組み合わせて使えば構造化データのマッチングなんかで強力な武器になるしいい言語だな!
皆んなでインタープリターのソース読んでProlog広めようぜ!
937デフォルトの名無しさん
2020/06/04(木) 14:49:43.71ID:KwTRcPMk プロログがあるならエピログもあってしかるべき。
938デフォルトの名無しさん
2020/06/04(木) 14:58:29.29ID:fpPgT8jn939デフォルトの名無しさん
2020/06/04(木) 15:12:11.04ID:KwTRcPMk ボンジュールの仲間みたいなもんですか、
そいつは気が付きませんでした、レス有難う。
ところでこっちの質問もお願いします。
https://mevius.5ch.net/test/read.cgi/tech/1560333895/533
そいつは気が付きませんでした、レス有難う。
ところでこっちの質問もお願いします。
https://mevius.5ch.net/test/read.cgi/tech/1560333895/533
940デフォルトの名無しさん
2020/06/04(木) 15:21:08.64ID:fpPgT8jn JSとか知らんがな
941デフォルトの名無しさん
2020/06/04(木) 15:23:07.67ID:KwTRcPMk HTMLパーサの話題なんだけど、HTMLならウェブ系のスレかと思って書き込んだけど、レスが付かない。
942デフォルトの名無しさん
2020/06/04(木) 15:27:20.61ID:gUiBGuRe 考えられてはいたらしい
述語論理型プログラミング-EPILOGの提案-
https://dbnst.nii.ac.jp/pro/detail/716
本研究の成果に対して、情報処理学会は、1985年、
淵 一博((財)新世代コンピュータ技術開発機構)に
創立25周年記念論文賞を贈った。
述語論理型プログラミング-EPILOGの提案-
https://dbnst.nii.ac.jp/pro/detail/716
本研究の成果に対して、情報処理学会は、1985年、
淵 一博((財)新世代コンピュータ技術開発機構)に
創立25周年記念論文賞を贈った。
943デフォルトの名無しさん
2020/06/04(木) 16:51:20.08ID:fpPgT8jn >>942
あったんだw
論文読んでる途中だけどかなり勉強になるな
細かい理解はまだだけど。
そもそも確率的な揺らぎを認めない論理プログラミングにどこまで可能性があるか疑問だけどな
Prolog拡張するならそこだろって思うわ
あったんだw
論文読んでる途中だけどかなり勉強になるな
細かい理解はまだだけど。
そもそも確率的な揺らぎを認めない論理プログラミングにどこまで可能性があるか疑問だけどな
Prolog拡張するならそこだろって思うわ
944デフォルトの名無しさん
2020/06/05(金) 02:51:03.47ID:xsOq73W5 Prologが何かわからないので誘導されて
1レスから943レスまで目を回してみたけど
初心者向けなんですかここ?
何をどうするプログラムなのかが
ジャンルすら不明でまったく意味不明です。
まずPrologは何が何でPrologの
ハローワールドの実行方法を教えてください。
1レスから943レスまで目を回してみたけど
初心者向けなんですかここ?
何をどうするプログラムなのかが
ジャンルすら不明でまったく意味不明です。
まずPrologは何が何でPrologの
ハローワールドの実行方法を教えてください。
945デフォルトの名無しさん
2020/06/05(金) 10:10:23.61ID:Ob2W58Ja946デフォルトの名無しさん
2020/06/05(金) 11:21:23.43ID:p2r1F5vv てかPrologスレってもう一個あるんだけどどっちかに統一しないか?
ただでさえ人少ないのに2つもいらんだろ
↓こっちの方が人多そう
http://itest.5ch.net/mevius/test/read.cgi/tech/1490334702
ただでさえ人少ないのに2つもいらんだろ
↓こっちの方が人多そう
http://itest.5ch.net/mevius/test/read.cgi/tech/1490334702
947デフォルトの名無しさん
2020/06/05(金) 12:48:16.98ID:VSGBAHWN 今朝 7 時過ぎに某知恵袋にこんな投稿があった。
A : B は嘘つき
B : A か C が嘘つき
C : A が嘘つき
誰が嘘つきなのか調べるプログラムを書いてくれ
Prolog で書いてる間にこの投稿は削除された。
仕方ないからこっちに貼っておく。
evi_a( Liar) :- member( b/1, Liar).
evi_b( Liar) :- member( a/1, Liar) ; member( c/1, Liar).
evi_c( Liar) :- member( a/1, Liar).
p_evi( Liar,[]) :- write( Liar),nl.
p_evi( Liar,[P/Evi|T]) :-
G =.. [Evi,Liar],
( member( P/1, Liar) -> \+( G) ; G),
p_evi( Liar,T).
p_ml([]).
p_ml([[A,B,C]|T]) :-
Liar = [a/A,b/B,c/C],
( p_evi( Liar,[a/evi_a,b/evi_b,c/evi_c]) ; true ),
p_ml( T).
main :-
p_ml([[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]).
A : B は嘘つき
B : A か C が嘘つき
C : A が嘘つき
誰が嘘つきなのか調べるプログラムを書いてくれ
Prolog で書いてる間にこの投稿は削除された。
仕方ないからこっちに貼っておく。
evi_a( Liar) :- member( b/1, Liar).
evi_b( Liar) :- member( a/1, Liar) ; member( c/1, Liar).
evi_c( Liar) :- member( a/1, Liar).
p_evi( Liar,[]) :- write( Liar),nl.
p_evi( Liar,[P/Evi|T]) :-
G =.. [Evi,Liar],
( member( P/1, Liar) -> \+( G) ; G),
p_evi( Liar,T).
p_ml([]).
p_ml([[A,B,C]|T]) :-
Liar = [a/A,b/B,c/C],
( p_evi( Liar,[a/evi_a,b/evi_b,c/evi_c]) ; true ),
p_ml( T).
main :-
p_ml([[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]).
948デフォルトの名無しさん
2020/06/05(金) 15:03:37.36ID:+2GKliP9949デフォルトの名無しさん
2020/06/05(金) 22:46:33.92ID:VLb22M2N Prologが何かわからないので誘導されて
1レスから943レスまで目を回してみたけど
初心者向けなんですかここ?
何をどうするプログラムなのかが
ジャンルすら不明でまったく意味不明です。
まずPrologは何が何でPrologの
ハローワールドの実行方法を教えてください。
1レスから943レスまで目を回してみたけど
初心者向けなんですかここ?
何をどうするプログラムなのかが
ジャンルすら不明でまったく意味不明です。
まずPrologは何が何でPrologの
ハローワールドの実行方法を教えてください。
950デフォルトの名無しさん
2020/06/06(土) 12:00:17.93ID:qHMuyDwQ :- writeln('hello world'),halt.
951デフォルトの名無しさん
2020/06/06(土) 13:34:07.16ID:nPYA670X >>949
knowledge base(=factとrule)を書いてそれに対してqueryを投げて答えを得る
そういうスタイルで書く言語
原理的にはパターンマッチとbacktrack
論理パズルや組み合わせ問題なんかは比較的簡単に書ける
(が他言語でsolverを使う場合に比べると遅いことが多い)
http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse1
↑このチュートリアルを読みつつ
↓ここで試すといい
https://swish.swi-prolog.org/
knowledge base(=factとrule)を書いてそれに対してqueryを投げて答えを得る
そういうスタイルで書く言語
原理的にはパターンマッチとbacktrack
論理パズルや組み合わせ問題なんかは比較的簡単に書ける
(が他言語でsolverを使う場合に比べると遅いことが多い)
http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse1
↑このチュートリアルを読みつつ
↓ここで試すといい
https://swish.swi-prolog.org/
952デフォルトの名無しさん
2020/06/07(日) 02:24:51.84ID:Yd5U2TwL >>950
ありがとうございます。なるほど1行でハロワ書けるんですか、でもそれでゲームのNPCにどうやって自然言語処理するのに使うんでしょうか?
プログラムなんて変数配列とif分岐とfor繰り返しでほぼ全て出来てると聞きましたけど、
それとは違うなんかデータの塊のような
Prolog ってヘンテコな変わったプログラミング言語なんですね。
六法全書読み込んで判例教えたら判決が出力されるんですか?
>>951
MySQLとかPythonのプロンプトような感じでしょうか?
コンソールで問い合わせて答えを得る的な基本CUI?
データベースのようなデータベースと違うようなイライザのようなチャット?
クエリー?エキスパートシステムの雛形?
第一引数にファイル渡すと読み込むんでしょ?
これはコマンドラインで引数渡して戻り値を取得する見たいに出来ないんですかね?
HTMLのActiveXからJScriptで受け取ったりとか
ありがとうございます。なるほど1行でハロワ書けるんですか、でもそれでゲームのNPCにどうやって自然言語処理するのに使うんでしょうか?
プログラムなんて変数配列とif分岐とfor繰り返しでほぼ全て出来てると聞きましたけど、
それとは違うなんかデータの塊のような
Prolog ってヘンテコな変わったプログラミング言語なんですね。
六法全書読み込んで判例教えたら判決が出力されるんですか?
>>951
MySQLとかPythonのプロンプトような感じでしょうか?
コンソールで問い合わせて答えを得る的な基本CUI?
データベースのようなデータベースと違うようなイライザのようなチャット?
クエリー?エキスパートシステムの雛形?
第一引数にファイル渡すと読み込むんでしょ?
これはコマンドラインで引数渡して戻り値を取得する見たいに出来ないんですかね?
HTMLのActiveXからJScriptで受け取ったりとか
953デフォルトの名無しさん
2020/06/07(日) 14:20:37.65ID:1jUe1e78 if と for を使う、普通のプログラミング言語としても使えるよ
if は違うゴール節に入る
for はすべて再帰で書く
それだけのこと
if は違うゴール節に入る
for はすべて再帰で書く
それだけのこと
954デフォルトの名無しさん
2020/06/07(日) 19:52:04.82ID:4Q/izaPV 言語を作った人達ですらappendの意味を理解できなかったらしいからな。
955デフォルトの名無しさん
2020/06/08(月) 02:35:20.50ID:OD6feMKZ Prologを使ったアイデアがいっぱい出てくる
機械学習の可能性に疑問を持ち始めた今こそコレだ!って感じがする笑
これからのテーマは「機械学習じゃ出来ないことをPrologでやろう」だな
因果関係とか戦略的意志決定とか胸が熱くなるんだが笑
機械学習の可能性に疑問を持ち始めた今こそコレだ!って感じがする笑
これからのテーマは「機械学習じゃ出来ないことをPrologでやろう」だな
因果関係とか戦略的意志決定とか胸が熱くなるんだが笑
956デフォルトの名無しさん
2020/06/08(月) 03:13:29.00ID:9sdXvh+T >>955
http://www.iluminado.jp/
その辺のシンボリックAIは80年代、90年代前半に色々検証されてBRMSに名前を変えて残っている。
結局、ブラックボックスになってメンテができないとか、データの精度がとか今の機械学習とおんなじ過ちを30
年前もやっている。
http://www.iluminado.jp/
その辺のシンボリックAIは80年代、90年代前半に色々検証されてBRMSに名前を変えて残っている。
結局、ブラックボックスになってメンテができないとか、データの精度がとか今の機械学習とおんなじ過ちを30
年前もやっている。
957デフォルトの名無しさん
2020/06/08(月) 03:58:01.65ID:OD6feMKZ >>956
なるほどBRMSか
JBoss BRMSとかいうのを調べたがWebとか色んな分野で使われててかなり面白そうだな
結局、Prologの立ち位置としてはそういうのとか他の色んなアルゴリズムの教育用途に適してるかもって思ったわ
簡潔に書けるし、アルゴリズムの教育に持って来いだな
小学校でヴィジュアルプログラミングとかやってる場合じゃねぇ!w
なるほどBRMSか
JBoss BRMSとかいうのを調べたがWebとか色んな分野で使われててかなり面白そうだな
結局、Prologの立ち位置としてはそういうのとか他の色んなアルゴリズムの教育用途に適してるかもって思ったわ
簡潔に書けるし、アルゴリズムの教育に持って来いだな
小学校でヴィジュアルプログラミングとかやってる場合じゃねぇ!w
958デフォルトの名無しさん
2020/06/08(月) 07:17:09.08ID:9sdXvh+T959デフォルトの名無しさん
2020/07/29(水) 07:26:24.50ID:SoSaYlfN iZ-Cのサンプルプログラム書き始めたので見てね。
sunasunax.hatenablog.com
sunasunax.hatenablog.com
960デフォルトの名無しさん
2020/08/02(日) 08:15:30.30ID:W4wBIQXC961デフォルトの名無しさん
2021/12/03(金) 21:44:45.76ID:E2QPyYLa A: Dはうそつきです
B: AとDのどちらかは本当のことを言っています
C: Bの言っていることは本当です
D: 私はうそつきではありません
正直者は必ず本当のことを言っています。
うそつきは必ずうそをつきます。
うそつきはいったい誰?
↑この問題って高階述語になるから一階述語論理しか扱えないPrologでは解けないって理解でいいの?
そうだとしたら現代ではコンピューターでどうやって解くの?
B: AとDのどちらかは本当のことを言っています
C: Bの言っていることは本当です
D: 私はうそつきではありません
正直者は必ず本当のことを言っています。
うそつきは必ずうそをつきます。
うそつきはいったい誰?
↑この問題って高階述語になるから一階述語論理しか扱えないPrologでは解けないって理解でいいの?
そうだとしたら現代ではコンピューターでどうやって解くの?
962デフォルトの名無しさん
2021/12/03(金) 23:00:48.21ID:Oj6t+xnM prologは高階述語も書けるよ
963デフォルトの名無しさん
2021/12/04(土) 06:16:48.61ID:CAsz35to >>962
実装選ぶ必要ありますか?どれでも可能?
実装選ぶ必要ありますか?どれでも可能?
964デフォルトの名無しさん
2021/12/04(土) 07:37:52.32ID:RAd/NC6B よく分からんけど高階論理は不要で、制約論理で解けるんじゃないか
https://www.swi-prolog.org/pldoc/man?section=clpb
Aの発言は Aが真ならDは偽、Aが偽ならDは真という制約になり、これは A=:=(~D) と表せる
Bの発言は B=:=(A+D)、Cの発言は C=:=B、Dの発言は D=:=D と表せる
まとめると ?- sat((A=:=(~D)) * (B=:=(A+D)) * (C=:=B) * (D=:=D)). となり答は
B = C, C = 1, sat(A=\=D). となる
これはBとCは正直、AとDのうち一人は正直でもう一人は嘘つきだけどどちらが嘘つきかは分からないということ
https://www.swi-prolog.org/pldoc/man?section=clpb
Aの発言は Aが真ならDは偽、Aが偽ならDは真という制約になり、これは A=:=(~D) と表せる
Bの発言は B=:=(A+D)、Cの発言は C=:=B、Dの発言は D=:=D と表せる
まとめると ?- sat((A=:=(~D)) * (B=:=(A+D)) * (C=:=B) * (D=:=D)). となり答は
B = C, C = 1, sat(A=\=D). となる
これはBとCは正直、AとDのうち一人は正直でもう一人は嘘つきだけどどちらが嘘つきかは分からないということ
965デフォルトの名無しさん
2021/12/04(土) 23:56:43.15ID:CAsz35to ありがとうございます
文章題からこの制約を書き下せる自信がない…(|||´Д`)
文章題からこの制約を書き下せる自信がない…(|||´Д`)
966964
2021/12/06(月) 19:23:33.90ID:JCSphZpm >>965
正直者は必ず本当のことを言い、うそつきは必ずうそをつくという条件があるので
Aが正直者であるかどうかとAが言っていることが正しいかどうかの真偽は同じになるということで、それを制約論理の式で表すだけ
A=:=(~D)は、A(Aが正直者であること)と(~D)(Aの発言内容「Dは嘘つきだ」)の真偽が一致している(=:=)ということ
Aが真なら(~D)も真だし、Aが偽なら(~D)も偽
他の3人についても同様
これをリンク先にある制約論理で表す
0 偽
1 真
~P not P
P*Q P and Q
P+Q P or Q
P=<Q PならばQ
P=:=Q PとQの真偽は同じ
P=\=Q PとQの真偽は異なる
正直者は必ず本当のことを言い、うそつきは必ずうそをつくという条件があるので
Aが正直者であるかどうかとAが言っていることが正しいかどうかの真偽は同じになるということで、それを制約論理の式で表すだけ
A=:=(~D)は、A(Aが正直者であること)と(~D)(Aの発言内容「Dは嘘つきだ」)の真偽が一致している(=:=)ということ
Aが真なら(~D)も真だし、Aが偽なら(~D)も偽
他の3人についても同様
これをリンク先にある制約論理で表す
0 偽
1 真
~P not P
P*Q P and Q
P+Q P or Q
P=<Q PならばQ
P=:=Q PとQの真偽は同じ
P=\=Q PとQの真偽は異なる
967964
2021/12/06(月) 19:33:58.30ID:JCSphZpm 制約論理を使わない(使えない)場合はどうしたらいいんだろ
d:-d.なんて書いても無限ループになるだけだし
d:-d.なんて書いても無限ループになるだけだし
968デフォルトの名無しさん
2022/11/14(月) 14:12:20.00ID:i6KxBWUg >>961-967
こういうのとか
s(A,B,C,D) :-
( A=true; A=false),
( B=true; B=false),
( C=true; C=false),
( D=true; D=false),
( A=true -> D=false ; true),
( A=false -> D=true ; true),
( B=true -> (A=true ; D=true); true) ,
( B=false -> A=false,D=false ; true),
C=B.
考え方は>>966と同じ
>正直者は必ず本当のことを言い、うそつきは必ずうそをつくという条件があるので
>Aが正直者であるかどうかとAが言っていることが正しいかどうかの真偽は同じになる
SWI-Prologで実行したら解は2つ
A = B, B = C, C = true, D = false
A,B,Cが正直者でDが嘘つき
A = false, B = C, C = D, D = true
Aが嘘つきでB,C,Dが正直者
これと同じだな
>これはBとCは正直、AとDのうち一人は正直でもう一人は嘘つきだけど
>どちらが嘘つきかは分からない
こういうのとか
s(A,B,C,D) :-
( A=true; A=false),
( B=true; B=false),
( C=true; C=false),
( D=true; D=false),
( A=true -> D=false ; true),
( A=false -> D=true ; true),
( B=true -> (A=true ; D=true); true) ,
( B=false -> A=false,D=false ; true),
C=B.
考え方は>>966と同じ
>正直者は必ず本当のことを言い、うそつきは必ずうそをつくという条件があるので
>Aが正直者であるかどうかとAが言っていることが正しいかどうかの真偽は同じになる
SWI-Prologで実行したら解は2つ
A = B, B = C, C = true, D = false
A,B,Cが正直者でDが嘘つき
A = false, B = C, C = D, D = true
Aが嘘つきでB,C,Dが正直者
これと同じだな
>これはBとCは正直、AとDのうち一人は正直でもう一人は嘘つきだけど
>どちらが嘘つきかは分からない
969デフォルトの名無しさん
2022/11/15(火) 01:18:50.21ID:26oE0jcj >>968
変えてみた
s2(A,B,C,D) :-
( A=true; A=false),
( B=true; B=false),
( C=true; C=false),
( D=true; D=false),
( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B.
変えてみた
s2(A,B,C,D) :-
( A=true; A=false),
( B=true; B=false),
( C=true; C=false),
( D=true; D=false),
( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B.
970デフォルトの名無しさん
2022/11/15(火) 01:39:59.69ID:26oE0jcj >>969
変えてみた
s3(A,B,C,D) :-
Boolean=[true,false],
( member(A, Boolean)),
( member(B, Boolean)),
( member(C, Boolean)),
( member(D, Boolean)),
( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B.
変えてみた
s3(A,B,C,D) :-
Boolean=[true,false],
( member(A, Boolean)),
( member(B, Boolean)),
( member(C, Boolean)),
( member(D, Boolean)),
( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B.
971デフォルトの名無しさん
2022/11/16(水) 07:59:27.34ID:KZpN7KA1 >>961
R. Smullyanのto mock a mocking birdの前編はこういう問題の宝庫でおすすめ
多分最も影響力のある論理学の啓蒙書だから釈迦に説法かもしれんが
公務員試験でもあるな、これくらいなら表書けば解ける、多分
R. Smullyanのto mock a mocking birdの前編はこういう問題の宝庫でおすすめ
多分最も影響力のある論理学の啓蒙書だから釈迦に説法かもしれんが
公務員試験でもあるな、これくらいなら表書けば解ける、多分
972デフォルトの名無しさん
2022/11/16(水) 09:10:20.86ID:CQNdPPMd 表を書いてみる
s4 :-
writeln("A B C D"),
writeln(""),
Boolean=[true,false],
forall(
( ( member(A,Boolean)),
( member(B,Boolean)),
( member(C,Boolean)),
( member(D,Boolean))),
( ( A->write("T ");write("F ")),
( B->write("T ");write("F ")),
( C->write("T ");write("F ")),
( D->write("T ");write("F ")),
( ( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B
-> writeln("○")
; writeln("×")))).
s4 :-
writeln("A B C D"),
writeln(""),
Boolean=[true,false],
forall(
( ( member(A,Boolean)),
( member(B,Boolean)),
( member(C,Boolean)),
( member(D,Boolean))),
( ( A->write("T ");write("F ")),
( B->write("T ");write("F ")),
( C->write("T ");write("F ")),
( D->write("T ");write("F ")),
( ( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B
-> writeln("○")
; writeln("×")))).
973デフォルトの名無しさん
2023/04/28(金) 14:17:28.49ID:8wk3+eV/ 、
974デフォルトの名無しさん
2023/04/28(金) 14:18:28.04ID:8wk3+eV/ こんばんは
975デフォルトの名無しさん
2023/04/28(金) 14:18:45.43ID:8wk3+eV/ サイフォン
976デフォルトの名無しさん
2023/04/28(金) 14:19:22.07ID:8wk3+eV/ てえすと
977デフォルトの名無しさん
2023/04/28(金) 14:19:35.56ID:8wk3+eV/ 究極のテスト
978デフォルトの名無しさん
2023/04/28(金) 14:19:58.05ID:8wk3+eV/ 。
979デフォルトの名無しさん
2023/04/28(金) 14:20:16.76ID:8wk3+eV/ 。?
980デフォルトの名無しさん
2023/04/28(金) 14:20:31.31ID:8wk3+eV/ マルチメディアってわけですね
981デフォルトの名無しさん
2023/04/28(金) 14:21:01.39ID:8wk3+eV/ え?
982デフォルトの名無しさん
2023/04/28(金) 14:21:07.70ID:8wk3+eV/ マジなのか?
983デフォルトの名無しさん
2023/04/28(金) 14:43:40.60ID:8wk3+eV/ めすや
984デフォルトの名無しさん
2023/04/28(金) 14:43:49.65ID:8wk3+eV/ ファイト
985デフォルトの名無しさん
2023/04/28(金) 15:28:13.87ID:8wk3+eV/ を
986デフォルトの名無しさん
2023/04/28(金) 15:28:19.38ID:8wk3+eV/ ルンバ
987デフォルトの名無しさん
2023/04/28(金) 16:33:24.56ID:1++JLEfi てすや
988デフォルトの名無しさん
2023/04/28(金) 16:33:30.09ID:1++JLEfi マジで
989デフォルトの名無しさん
2023/04/28(金) 20:43:36.57ID:tkMERdaz アドバンス
990デフォルトの名無しさん
2023/04/28(金) 20:56:50.79ID:tkMERdaz テスト
991デフォルトの名無しさん
2023/04/28(金) 20:57:07.91ID:tkMERdaz 、
992デフォルトの名無しさん
2023/04/28(金) 20:57:43.18ID:tkMERdaz 田中
993デフォルトの名無しさん
2023/04/28(金) 20:58:09.56ID:tkMERdaz この頃
994デフォルトの名無しさん
2023/04/28(金) 20:58:39.01ID:tkMERdaz こんばんは
995デフォルトの名無しさん
2023/04/28(金) 20:59:00.21ID:tkMERdaz 商店街
996デフォルトの名無しさん
2023/04/28(金) 20:59:20.67ID:tkMERdaz 。、
997デフォルトの名無しさん
2023/04/28(金) 20:59:45.91ID:tkMERdaz コンフィデンス
998デフォルトの名無しさん
2023/04/28(金) 21:00:11.27ID:tkMERdaz ごフレ
999デフォルトの名無しさん
2023/04/28(金) 21:00:17.86ID:tkMERdaz 。
1000デフォルトの名無しさん
2023/04/28(金) 21:00:52.22ID:tkMERdaz にたな
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 4556日 7時間 59分 56秒
新しいスレッドを立ててください。
life time: 4556日 7時間 59分 56秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 自民・麻生太郎 副総裁 石破政権の1年は「どよーん」 高市政権の発足で「何となく明るくなった」「世の中のことが決まり動いている」 [Hitzeschleier★]
- 東京都「都民の税金1.5兆円が国に奪われている」「全国に分配されている」に地方民ブチギレ [Hitzeschleier★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 【27歳会社員】「自慰行為に使うために」コインランドリーの乾燥機から24歳女性の下着など計11点(時価8万2080円相当)盗んだ疑い [nita★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- トランプ、G7に代わるcore 5を発表 [805596214]
- 為末大「ラーメン屋の行列を、年寄りが1万円渡してきて順番譲ってくれと言ったら? 答えられない問題だよ。」 [592058334]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★5
- 麻生太郎が石破政権の1年を酷評「どよーんとして何も動かない感じだったな。それに引き換え高市政権は物事が動いている」 [597533159]
- 【速報】室井佑月、米山隆一との離婚を決意wwwwwwwwwwwwwwwwwwww [802034645]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★4
