Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
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にする
帰納論理プログラミングも面白そう
ちょっと違うかもしれないが論理プログラミングにおけるメタプログラミングみたいな感じ?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【おこめ券】物価高対策の“おこめ券”全米販は1枚477円で販売へ 鈴木農水大臣「国民の皆様に活用いただきやすいよう工夫いただいた」★2 [ぐれ★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★5 [蚤の市★]
- 神田沙也加さん元恋人で元俳優の前山剛久 六本木のメンズラウンジ勤務を報告「真叶(まなと)です。よろしく」 [muffin★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 ★5 [蚤の市★]
- ハリウッド実写版『ストリートファイター』初映像解禁 リュウ&春麗らのビジュアルも公開 [muffin★]
- 【麻雀】プロ雀士の岡田紗佳さんが勝訴、点数計算めぐる発言は「違法とは言えず」 大宮簡裁 [征夷大将軍★]
- ムミィ🥺いる❓🏡
- 【高市悲報】片山さつき「かじ取り間違えてデフレになったらどうすんの!😡」😲 [359965264]
- 【乞食速報】43インチ4Kモニターが19800円。テレビも見れるぞ [419111196]
- ママカースト、地獄すぎるwwwwwwwwwwwwwwwwwwwww [977790669]
- VTuber叩きが大流行してる理由、1枚の画像で解説される…!! [858219337]
- 寒すぎる(´ ・ω・`)
