Prologでまったり Par ..
[2ch|▼Menu]
331:デフォルトの名無しさん
09/06/25 23:36:42
>>327さん 
ご指摘ありがとうございます
>>328-330さん
split(X, [], [], []).
split(X, [H|L], [H|B], A) :-
H =< X,
!,
split(X, L, B, A).
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).
と入れたら
* [X] - singleton variables in user:split/4
* Approximate lines: 1-2, file: 'と出てしまったのですがどうすればいいのでしょうか?

332:デフォルトの名無しさん
09/06/25 23:38:11
split(X, [], [], []).ではXを空リスト3つに分けているのですか?
否定(?)を利用してますがなくても問題ないですよね?

連レスすいません


333:328
09/06/26 00:27:34
>>331-332

ちょうど書き込み時間が重なったので、勘違いされたと思いますが、
>>328-329は私ですが、>>330は別の方の書き込みです。
splitの仕様は、>>325に合わせました。
* [X] - singleton variablesの警告は、1行目のsplitにおいて、左辺にあるXが
右辺で使われていませんよ、という意味です。
split(_, [], [], [])と書き直せば、この警告は消えると思います。

カットは必須ではありませんが、カットを使わない場合、
>>326のA>=B、A<Bのように背反となる条件を各々splitの定義に含める
必要があります。

334:デフォルトの名無しさん
09/06/26 01:22:10
>>332
まだ問題の理解が十分ではないようですね。その段階で>>325のように、
「〜というものを作りたいのですが」という言い方をするのはよくないと思います。

335:デフォルトの名無しさん
09/06/26 01:26:37
スミマセン、なんか言い過ぎましたw
そんなによくなくもないかもしれません

336:デフォルトの名無しさん
09/06/26 04:52:07
>>332
なかなか、よい発想をされますね。[]の分割問題ですね。これは、
あなたが、「 []を分割してBefore=[] After=[] なんて許さん。偽だ。」と
考えるなら、この述語は
split(X,[H],[H],[]) :- H=<X,!.
split(X,[H],[],[H]) :- H>X,!.
split(X,[H|L],[H|A],B) :- H=<X,split(X,L,A,B).
split(X,[H|L],A,[H|B]) :- H>X,split(X,L,A,B).
となります。普通私たちは、
?- split(5,[],A,B).
A = [],
B = []
が好ましい仕様だと思い込んでいるのですが、
少々Prolog呆けしているのかも知れません。

337:デフォルトの名無しさん
09/06/26 05:09:00
私たちって言うな

338:デフォルトの名無しさん
09/06/26 05:23:14
>>337
リストの再帰で、
[]になった場合の検証から入るプログラマって
そんなにいるかな。まあ、時間的には一瞬だけど。
もし、変数が来たらは、常に注意を張りながらだと思うけど。

339:デフォルトの名無しさん
09/06/26 05:37:18
>>338
宣言的でありたいというのがある。
できることなら停止節なんて省略したい。
こういう姿勢だから、考えないね。


340:デフォルトの名無しさん
09/06/26 05:47:30
微妙すぎる。>>332は明確に否定するのが親切だと思うけど、
そもそもどこかの宿題を乱暴に投げているだけような気配がするw

341:デフォルトの名無しさん
09/06/26 06:01:59
>>339
それだ! 停止節省略指示子の導入。
帰納論理がそこそこ行けるんだったら、
それくらい処理系にやらせたっていいじゃないか。

342:デフォルトの名無しさん
09/06/26 18:33:08
途中まで作って、トレースモードにして、正解を問い合わせればいい
| ?-split(5,[3,7,2,6,5,8],[3,2,5],[7,6,8]).
+ (1) 1 Call: split(5,[3,7,2,6,5,8],[3,2,5],[7,6,8]) ?l
+ (4) 2 Call: split(5,[7,2,6,5,8],[2,5],[7,6,8]) ?l
+ (5) 3 Call: split(5,[2,6,5,8],[2,5],[6,8]) ?l
+ (8) 4 Call: split(5,[6,5,8],[5],[6,8]) ?l
+ (9) 5 Call: split(5,[5,8],[5],[8]) ?l
+ (12) 6 Call: split(5,[8],[],[8]) ?l
+ (13) 7 Call: split(5,[],[],[]) ?l
+ (13) 7 Fail: split(5,[],[],[]) ?l
+ (12) 6 Fail: split(5,[8],[],[8]) ?l

343:デフォルトの名無しさん
09/06/26 18:35:25
「トレースモードにして」じゃなくて「スパイ点を設定して」か

344:デフォルトの名無しさん
09/06/26 21:10:24
>>333さん
すいませんでした。
なるほど、カットするとそこで探索を停止するからですね?
>>334-335さん
おっしゃるとおりです・・・。prolog理解するのとても難しいです
>>336さん
空リストを停止条件に持っていく場合とそうでない場合の見極めが難しいです
>>337さん
落ち着いてください
>>339さん
て、停止節ですか?
>>340さん
丸投げではないです・・・。
>>342さん
すいません。僕の使ってるprologは未完成での実行はできないです

345:デフォルトの名無しさん
09/06/26 21:13:40
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).
でH =< Xではない時をマッチングさせるんでよね?

346:デフォルトの名無しさん
09/06/26 21:44:57
カット(!)はまだ勉強していない、という前提で進めた方がいいんでしょうか

347:デフォルトの名無しさん
09/06/26 21:47:54
>>332
> 否定(?)を利用してますがなくても問題ないですよね?

これはなぜそう思ったんですか

348:デフォルトの名無しさん
09/06/26 21:56:13
>>326
> /*入力した変数Nより小さい場合 */
> split([A,B|R],[A|T1],[B|T2]) :-
> A >= B,
> split(R,[A|T1],T2).

この「変数N」というようなコメントは、問題についていたヒントか何かですか

349:デフォルトの名無しさん
09/06/26 22:31:18
Prologって面白すぎ。もっと流行ればよいのに。

350:デフォルトの名無しさん
09/06/27 01:46:01
>>346さん
軽く説明された程度です
>>347さん
授業の説明だと余分なところまでマッチングしないようにするためだと聞いたので
なくてもいいのかなぁと
>>348さん
そこは自分でプログラムするときわかりやすいように書いてみただけです
>>349さん
面白いですけど難しくて頭が痛くなりますw

351:デフォルトの名無しさん
09/06/27 02:26:10
>>344
> すいません。僕の使ってるprologは未完成での実行はできないです

デバッグ機能がないというのはちょっと考えにくいので、
差し支えなければ処理系の名前を、参考までに。
一つ一つの確認を細かくしないと、Prologのプログラムはなかなか組めないんじゃないかと思います。

352:デフォルトの名無しさん
09/06/27 02:43:19
>>325 >>344
リストがそれぞれ何らかの「集合」を表していると解釈すれば自明ではないでしょうか。
・空集合の部分集合は(どんな条件がついても)空集合だけ
・空集合を表すリストは空リストだけ

353:デフォルトの名無しさん
09/06/27 06:05:07
>>350
いろんな言語で宿題スレ
スレリンク(tech板)
にPrologのプログラムが沢山載っています。
間違ってるところや、それを逐次修正していく過程が晒されている部分。
処理系依存(あるPrologでは動くが別のPrologでは述語未定義となり動かない)の
ところも多いから、いろいろな意味で勉強になると思います。

354:デフォルトの名無しさん
09/06/27 08:44:23
自演乙

355:デフォルトの名無しさん
09/06/27 11:22:10
>>351さん
terateamを使ってLinuxにアクセスしてemacsやらsicstusを入力してやってます
>>352さん
貴重なご意見感謝します
うまく見分けれるように頑張ります
>>353さん
prologの宿題スレになってますねw
こっちのスレを回ってみようと思います。情報ありがとうございました
>>354さん
いったい何と戦っているんですか?ここで自演して自分に有益になるとは到底思えませんが?
とりあえず落ち着いてください

356:353
09/06/27 16:39:14
>>354
いろんな言語で宿題スレに大量に書き込んでいるのは私ですが、
それがなにか?
これは前スレで、よそのスレに載っているプログラムや課題を
このスレでPrologに書き直そうという提唱や、
Prolog10000Tipsを目指す活動の手始めです。

357:デフォルトの名無しさん
09/06/27 23:09:40
prologプログラムの無限ループバグを防ぐtipsを教えてください。

C以上に暴走しやすい危険な言語ですね。

358:デフォルトの名無しさん
09/06/27 23:31:14
>>356
>>338-339と>>341もあなたではないかと思っているのですが、ひょっとして…?w

359:デフォルトの名無しさん
09/06/27 23:35:50
>>357
> 暴走しやすい

これはいつだか、大学の先生がPrologで作ったCGIが無限ループしてひどいことになっていたのを見て思った

360:デフォルトの名無しさん
09/06/27 23:48:12
>>356
これまでの観察によれば
・動作確認をしないことが多い。
・ISOから外れた述語を断りなく多用する。not/1など。
・勘違いを書いても明確に訂正しない。
このへんはちょっとどうかと思っています。
2ちゃんねるだからアリ、という考えなのかもしれませんが。

361:デフォルトの名無しさん
09/06/27 23:55:39
オウフ語
・”F”は、太ったものに当てはまる。
・”G”は、貪欲なものに当てはまる。
・”a”は、アルバートを表示する。
・”b”は、ベティを表示する。
・主語述語形式の文”Pn”が新であるのが、”n”が表示するものが、
 ”P”が当てはまるもののクラスの要素であるとき、かつ、そのときに限る。
・”¬A”という形式の文が新であるのは、文Aが真で無いとき、
 かつ、そのときに限る。
・”A&B”という形式の文が新であるのは、文Aと文Bがともに新であるとき、
 かつ、そのときに限る。

362:デフォルトの名無しさん
09/06/27 23:57:11
誤字多すぎた。も一回。
オウフ語
・”F”は、太ったものに当てはまる。
・”G”は、貪欲なものに当てはまる。
・”a”は、アルバートを表示する。
・”b”は、ベティを表示する。
・主語述語形式の文”Pn”が真であるのは、”n”が表示するものが、
 ”P”が当てはまるもののクラスの要素であるとき、かつ、そのときに限る。
・”¬A”という形式の文が真であるのは、文Aが真で無いとき、
 かつ、そのときに限る。
・”A&B”という形式の文が真であるのは、文Aと文Bがともに真であるとき、
 かつ、そのときに限る。

363:デフォルトの名無しさん
09/06/28 00:06:31
>>359で言ったCGIですが、今探してみたら、ちょっと様子が違いました。
URLリンク(web.sfc.keio.ac.jp)
> # 卓上計算機の実行
> # 卓上計算機 Prolog CGI ソース (calculator.cgi)

・「実行」のリンクが切れている。
・「CGI ソース」のリンク先は無限ループになるが、本来実行されないもののように見える。

364:デフォルトの名無しさん
09/06/28 00:10:06
表示的意味論付き単純言語オウフ。
例えば、アルバートを表示する、というのはアルバートという人がそこにいる
事態を指す/結びつける。

365:デフォルトの名無しさん
09/06/28 00:50:38
参考文献も表示したほうがいいのではw

366:デフォルトの名無しさん
09/06/28 01:02:45
>>363
つまりこういうことかも。
・POSTなりGETなりの方式で入力が与えられることを前提にしている。
・無入力の場合に暴走するように書いてしまっている。
・読ませるためのソースに実行可能フラグをつけてしまった。

367:デフォルトの名無しさん
09/06/28 02:35:52
用語が変だった
"実行可能フラグ" の検索結果 約 291 件中 1 - 10 件目 (0.19 秒)
> 真ということ は、実行可能フラグが立っていることを表すに過ぎません
> True indicates only that the execute flag is on.
"execute flag" -"No Execute flag" の検索結果 約 963 件中 1 - 10 件目 (0.13 秒)

「実行許可(ビット)」あたりかな

368:デフォルトの名無しさん
09/06/28 04:42:04
>>360
しっかりと、観察して下さったようで、ありがとうございます。
すでに利用していて、それを多少読みやすく書き換えたものも
ありますが、Firefoxの六行の小さな窓の中で上から書きながしたものが
ほとんどで実際動作実行をしたものはあまりありません。
Upしたものを読み返して、間違ってるなと気がついた時は訂正して
いると思いますが。C/C++の宿題スレの更新速度が急でコーヒー休憩に
少しづつ課題をUpして次の休憩にコードを書きなぐるという書き込みな
ので、実行確認は今後もしないと思います。間違いは指摘してください。
標準の組み込み述語に限定すると、2chの1レス枠に入らなくなる
課題が多いため、繰り返し使われるものについてはライブラリに
あるものとして、いちいちの定義を省略しています。
get_line/1または2、get_lines/2、split/3、concat_atom/3、append/4、
などがそれです。他の言語との比較と言う観点からはフェアでないとも
言えますが、書き込みの目的がチュートリアルの草稿としてこれを公開
することにあるのであまりその点は気にしていません。not/1は\+より
こちらの方が誰にでも意味がわかるいう理由でこれで通しています。

369:368
09/06/28 05:01:05
>>358
>>336>>338>>340は私だが、>>339は違うよ。この時間帯に
読んでくれているのが誰だかは知っているがw

370:デフォルトの名無しさん
09/06/28 05:08:06
と、いう人がいるので注意してください。

371:368
09/06/28 05:13:09
10000Tipsについては、著作権の問題が出てくるようで
弁護士に相談中。いちいち著作者に了解をとることは
コスト的に無理なようなので。
試しにスポーツルールの述語化をしてみようと思ったの
ですが、ただただベースボールマガジン社が発行している
著作物を編集し直した物になってしまいました。

372:デフォルトの名無しさん
09/06/28 05:15:58
>>368
>>309-312はまだちゃんと訂正していないような気が

373:デフォルトの名無しさん
09/06/28 05:30:15
>>370
ところであなたも早朝派ですか?
私は早朝ジョギング派なので3時半起きで、2chの書き込みも
その後1-2時間の間にしますが、それに関してのメールが6時前に
到着しているので驚くのですが。結構多いんですね。

374:デフォルトの名無しさん
09/06/28 05:43:54
>>311 サービスで仕様を拡張していますが、そこはそのままにすると、
g1(L) :- g1_prompt,read(X),g1_2(X,L).

g1_2(end,[]).
g1_2(A,[A|R]) :- \+(A==end),g1_prompt,read(B),g1_2(B,R).

g1_prompt :- write('input=').

ですか。

375:デフォルトの名無しさん
09/06/28 05:44:31
早朝派じゃないのに書き込んでみるテスト

Prologって研究には良さそうでも就職にはヤヴァそう
C, C++, Java辺りを必須という求人は何度も見たことはあるが
Prolog必須という求人は見たことがない

376:デフォルトの名無しさん
09/06/28 05:52:09
なぜか日本では皆無ですね。
うちがそのうちのせますが。いまはきゅうじんのよゆうなし。

377:374
09/06/28 06:15:11
何の話か明確にすると、
?- ... , g1(L), ... ,fail.

のように、一度end入力で終了したg1がバックトラックによって、
再び実行の可能性が生まれた場合に、意図通りの結果になるかと
いうことです。

378:デフォルトの名無しさん
09/06/28 07:47:04
それから、いろんな言語で宿題スレですが、私のPrologコードは
課題を示したレス番号の頭にtをつけたHTMLファイルを
nojiriko.asia/prolog/ というディレクトリに全部コピーすることに
しています。メールなどで間違っているんじゃないかと指摘を受けた
場合は、このサイトの方はできるだけ速やかに訂正しますが、宿題スレ
の方にはその旨の書き込みはしません。いつの間にか書き換わって
いることも多いのでちょっと覗いてみてください。


379:デフォルトの名無しさん
09/06/28 08:03:33
>>375
いまやビジネスの世界はひたすら論理。今まで日本は会社規則があっても
無視してたり。契約書作成しようと思うと取引先から敬遠されたりと、
論理的なことを何かと回避できる環境にあった。
んでまぁそういう時代は終わりを迎えている。

今や本屋の自己啓発本コーナに行けば論理が大事だ、という本が置かれ、
論理に対する需要と言うのはかなり上がっている。

確かに一般に普及する可能性は低いけど、上記の論理的な力を必要とする層
(金融とかコンサルとか上流の方々ね)には教育用ツールとして需要がある
可能性はある。例えば、『〜論理トレーニング』という本の内容として
prologによる論理トレーニングとか。
あとは、企業の訴訟リスクが上がっているとかなんとか理由つけて法律の
エキスパートシステム作ってみるとか。
裁判所の判例はもはや膨大で、弁護士費用は高い。とりあえず、抱えている案件に
合致する判例があるかどうか探索するシステムとか作れば結構いけるんじゃない。
法律家の助けが必要だけど。差別化は結構できるんじゃないかね。

380:デフォルトの名無しさん
09/06/28 08:08:52
あと、心理学の人と、認知科学の人、哲学の人も必須だな。
普通にやると第五世代と同じ末路になる。

あと問題は日本語文のパターンマッチかな。

381:デフォルトの名無しさん
09/06/28 08:12:55
うーん。微妙な日本語だ。

382:デフォルトの名無しさん
09/06/28 08:30:47
あと20年前と違うのはWebの発展なんだから、セマンティックウェブ関連で
なんか出来そう。
500億かけた研究結果がそのまんま公開されてて、しかもどうやらあんまり
中身を見られていないみたいなんだし、意外と宝の山かもしれないよ。
(評価計算の方法がわからないし、現在価値としては下がっているけど
少なくとも数千万ぐらいの資本価値はあると考えてもいいはず。いきなり
数千万資本をゲットできるというのはそれなりにお得な気はする。)

見直す価値がある可能性はある。

383:デフォルトの名無しさん
09/06/28 14:59:53
「いろんな言語で宿題スレ」の中で
スレリンク(tech板:168番)
スレリンク(tech板:225番)
といったProlog向き問題が未回答となっています。
どなたか、よろしくお願いします。

384:デフォルトの名無しさん
09/06/30 05:45:20
前に10000Tipsは著作権の問題が出てくるということを書いたのですが、
意味がわからんとのご意見メールをいただきました。
私の「Tip」のイメージを示します。これで2Tips。

燃ゆる頬(ラグビーの頬傷ほてる海見ては).
燃ゆる頬(車輪繕う地のたんぽゝに頬つけて).
燃ゆる頬(目つむりていても吾を統ぶ五月の鷹).
燃ゆる頬(沖もわが故郷ぞ小鳥湧き立つは).
<以下略>

句集(燃ゆる頬,寺山修司,ラグビーの頬傷ほてる海見ては).
句集(燃ゆる頬,寺山修司,車輪繕う地のたんぽゝに頬つけて).
句集(燃ゆる頬,寺山修司,目つむりていても吾を統ぶ五月の鷹).
句集(燃ゆる頬,寺山修司,沖もわが故郷ぞ小鳥湧き立つは).
<以下略>


385:デフォルトの名無しさん
09/06/30 07:48:21
----- ここまで役に立つTipなし

386:デフォルトの名無しさん
09/06/30 15:44:51
Tips というより、データベースでは?

387:デフォルトの名無しさん
09/06/30 17:06:38
>>386
Prologですからデータベースですが、それをTipという感覚でやろうということです。
福島さんが100mの日本記録出した時、何歩で走ったか。これをビデオで確認したから
述語としておこう。これでひとつ。
Googleで検索できない対象というのがありますね。一つには過去の文献や文学作品の
内容に関する部分。無尽蔵にあります。これはTipとして復活するだけで価値がある。
構造のしっかりしたデータベースである必要もないし、述語として十分に機能する
必要さえない。気楽に日常的に拾い上げられることだけが大事です。


388:デフォルトの名無しさん
09/06/30 18:55:33
天気(神奈川,20090630,晴れ).

389:デフォルトの名無しさん
09/06/30 18:58:04
好き(イチノ,理美).

390:デフォルトの名無しさん
09/06/30 21:26:12
% p(原因, 結果)
?- p(X, 俺に彼女ができる).
false


391:デフォルトの名無しさん
09/07/01 02:15:02
マル得Prologトリビア探検隊
URLリンク(gollem.science.uva.nl)
SWI-Prolog 5.6.60 Reference Manual
> \
> +/1
> /2
> 1
> =/2
> ==/2
> =@=/2

URLリンク(www.ic.unicamp.br)
SWI-Prolog 3.2.9 Reference Manual
> \
> /1
> /2
> 1
> /2
> =/2
> @=/2

\+と\=の消え方が変化している

392:387
09/07/01 05:32:35
気楽にと書きましたが、逆に徹底してとか、偏執狂的にというのも
あるでしょう。ある書物を徹底的に述語化してしまうとなどがこれ
です。古典的なものはもちろん現代の例えば白書的なものでも、
表、グラフの述語化は十分に有用で希少価値を持ちます。社会的に
文章、表、グラフなどの中立をする形式は未開拓であり、未完成に
放置しても、後に利用、発展が自然に可能なProlog述語への書き換
えは有力なものではないでしょうか。


393:デフォルトの名無しさん
09/07/01 05:59:28
>>391
わからないです(><;)

394:デフォルトの名無しさん
09/07/01 06:13:14
前スレに書いたことですが、私のインタプリタ環境で
?- 相模(X).
と質問すると答えが返ってきます。相模/1は未定義ですが。
未定義の質問が(導出の最中でも)現れると、その述語名の
性質を調べて、関係ありそうな分野からの検索します。分野には
古典文学->歴史文献->地名等 の優先順位がつけられているため
?- 相模(X).
X = 花ならぬなぐさめもなき山里に桜はしばし散らずもあらなむ;
X = なにか思ふなにをか嘆く春の野に君よりほかに菫つませじ;
X = 見わたせば波のしがらみかけてけり卯の花さける玉川の里
no という具合になります。この歌並びからこれは千人万首を
検索してるだけだなとわかってしまいますw
セマンティックウェブの話もありましたが、ウェブに頼らずこういった
情報発信を自らPrologサーバからやろうではないかということです。
多くのボランティア的献身によって(千人万首もそうだ)我々のウェブ
環境は豊かになりましたが、的確に得られる情報は未だ極々僅かです。
負担にならない蒐集・表示形式としてPrologが活躍する余地は大きい
ように思いますが如何でしょうか?

395:デフォルトの名無しさん
09/07/01 06:38:23
URLリンク(www.eng.cam.ac.uk)
> Tabbing commands
> * \= (set tab)
:
> * \+ (indent; move margin right)

URLリンク(www.eng.cam.ac.uk)
> Exceptions to this rule:
> * \ itself because \\ has its own special meaning. Use $\backslash$.

このへんだな

396:デフォルトの名無しさん
09/07/01 10:04:07
やばい>>395のLaTeX説は眉唾だった。\/が消える説明がつかない。
URLリンク(prolog.cs.vu.nl)
Perlでひたすらs/.../.../g;していたとは。。

397:デフォルトの名無しさん
09/07/01 12:16:39

split(5, [3,7,2,6,5,8], Before, After).

Before = [3,2,5] (5と同じか、小さい数のリスト)
After = [7,6,8] (5より大きい数のリスト)
このようにリストの中を与えた数より大きいか小さいかで分けたいのですが
どうすればよいのでしょうか?

398:デフォルトの名無しさん
09/07/01 12:24:08
>>325以降をどうぞ

399:デフォルトの名無しさん
09/07/02 00:01:03
>>387
opencycとかWordnetの日本版ってこと?


400:デフォルトの名無しさん
09/07/02 06:39:12
>>399
そうですねとは、さすがにいえないw まだ何も始まってないから。
ライブラリを目指すのではなく、
断簡、反古として知識、ルールの切れっ端を
可能な限り隙間なく集める。述語とする。
ありとあらゆる分野に於いて。
使い手は適宜、論理変数を補充して、自分にふさわしい
使い方を見つける。
10000Tipsとは極度に控えめに言っている。
10000があっという間ではないかと予感させる一例を。

典拠不詳(古墳多くは少年の人).
/* でも、 */
古墳多くは少年の人(求塚,世阿弥,典拠不詳).
/* でも */
述語にしておこうと思い立った人が閃いた形式で登録すればよい。
典拠不詳であることが大事なのか、世阿弥の求塚という作品に
「古墳多くは少年の人」という一節があることを伝えたいのか、
そんなことはどうでもよい。心にとまったことを書き付ける形式が
ひとつあるということだけが大事なのだ。

401:デフォルトの名無しさん
09/07/02 15:48:03
Prologトリビア探検隊・予感編
URLリンク(dspace.wul.waseda.ac.jp)
> 充足する必要のある 2 つの別の目標 (goal) からなる質問の組み合わせは、
:
> ゴールの充足が試みられたとき、箱の中にある節と適合してその節の
:
> 1. クエリーとして、hoge(F, name5)が入力されたとき、

C&M邦訳を要約したと思われる部分だけカタカナ語が少ない。

402:デフォルトの名無しさん
09/07/03 00:28:35
>>400
意図としては大体了解できたと思う。ただ、

>>ありとあらゆる分野に於いて。

というのは、気を悪くして欲しくないけど、それは危険フラグだ。
辞書爆発が問題で使い物にならないといわれているのに、
改めてそれに無策で挑むというのは、人を説得しきれない。

むしろ分野を限りなく限定させてしまったほうが面白い結果が
得られるかもしれない、と無責任に思う。

403:デフォルトの名無しさん
09/07/03 01:01:58
URLリンク(abelard.flet.keio.ac.jp)


404:デフォルトの名無しさん
09/07/03 02:44:42
言語哲学にどう接続させるか。

405:デフォルトの名無しさん
09/07/03 10:01:55
URLリンク(sourceforge.jp)
> あらゆる情報を Prolog のプログラムとして蓄積する為の基盤作りをしようと思います。

> 登録日: 2009-07-01 08:05

またそういう

406:デフォルトの名無しさん
09/07/03 20:10:06
人は壁にぶつかって成長していく。静かに見守ろう。

407:デフォルトの名無しさん
09/07/03 21:01:35
切れっ端ならtipsじゃなくてchipsだね

408:デフォルトの名無しさん
09/07/03 21:06:53
辞書でchipを引くとひどい意味ばかりあるw

409:デフォルトの名無しさん
09/07/04 02:33:05
最近まったりが足りない。

410:デフォルトの名無しさん
09/07/07 03:34:34
Prologではったり


411:デフォルトの名無しさん
09/07/08 22:33:31
この言語極めたらガンダムのハロとかオートマトン作れんの?

412:デフォルトの名無しさん
09/07/08 23:36:30
うん

413:デフォルトの名無しさん
09/07/11 09:55:54
失礼します初心者です。

Prologで(C言語的な意味で)普通の計算式ってどういう風に書くのですか。
x=50
y=100
z=x^2+2*y+5
print(z)

みたいなかんじのことをProlog風に書くとどうなるのでしょうか。






414:デフォルトの名無しさん
09/07/11 11:26:30
>>413 Prolog風かどうかは疑問ですが。どこが違うかよく見てください。
?-
X=50,
Y=100,
Z is X^2+2*Y+5,
write(Z).

415:デフォルトの名無しさん
09/07/11 16:27:01
>>413
>>1に上がっているサイトにもいくつかあります
URLリンク(bach.istc.kobe-u.ac.jp)
URLリンク(www.geocities.jp)
その他
URLリンク(www.kprolog.com)


416:413
09/07/18 06:57:50
遅くなりました。プロバイダがアク禁だったので。
おかげさまで計算することができました。ありがとうございました。



417:デフォルトの名無しさん
09/07/20 23:29:08
他スレで質問したのですが流れてしまったのでこちらで質問させてください
?- con2(2, [1,3]).
no
?- con2(1, [2,3]).
yes
と答えるようにしたいのですがどうしたらよいのでしょうか?

418:デフォルトの名無しさん
09/07/21 00:06:42
con2(1, [2,3])だけをyesとしたいのであれば、

con2(1, [2,3]).

と定義するだけでOK。

419:デフォルトの名無しさん
09/07/21 00:08:42
>>417
con2(X,Y) :- X = 1, Y = [2,3].


420:デフォルトの名無しさん
09/07/21 00:29:14
>>418さん>>419さん
言葉が足りていませんでした・・・。
今、ハノイの塔の問題を作っていて
ペグの上に載るディスクは常にそのペグの最小ではならないと
移動先でもディスクは最小でないとならないって言う制約の判定をする部分を
作っていてそこに当たる部分なんですが・・・。

途中までは作って制約の部分の製作がわからなかったのでこちらで質問させて
いただきました

未完成のプログラム乗せたほうがいいですか?

421:デフォルトの名無しさん
09/07/21 02:35:46
>>420
一番上の円盤(B)がAより大きい
con2(A,[B|R]) :- A < B.

422:デフォルトの名無しさん
09/07/21 02:54:44
>>420

'Aの一番上の円盤がBの一番上の円盤より小さい'(A,B) :- A=[A1|_],B=[B1|_],A1 < B1.

'Aには現在載せられない'(A,B,C) :- A=[A1|_],B=[B1|_],C=[C1|_],A1 < B1,A1 < C1.

423:デフォルトの名無しさん
09/07/21 06:21:32
>>420
本当に必要な述語はどんなものかという分析ができているのかどうか
ちょっと不安

424:デフォルトの名無しさん
09/07/21 07:05:40
>>417
?- con2(1,[]).

これは?

425:デフォルトの名無しさん
09/07/21 23:35:36
>>421さん
そのままのせてみたらエラーが出たのでcon2(A,[B|R]) :- A < B.
をcon2(A,[B|_]) :- A < B.としたらソースの読み込みはできたのですが
エラーが出てしまいました

>>422さん
それをいれて実行してみたら
Permission error: cannot redefine built_in ','とでてしまいました
(A,B) :- A=[A1|_],B=[B1|_],A1 < B1.の部分はまとめると
con2(A,[B|R]) :- A < B. となるのかなぁと思ったのですがどうでしょう?

>>423さん
なんかその通りなきがしてきました・・・。

>>424さん
申し訳ないです。そこまでは書いてなかったです

426:デフォルトの名無しさん
09/07/21 23:40:33
>>425です連レスすいません
:- [search].

initial_state(hanoi, [[1,2,3],[],[]]).
goal_state(hanoi, [[],[],[1,2,3]]).

operator(hanoi, left_to_right(Disk), [[Disk|RestA], B, C], [RestA, B, [Disk|C]]) :-
con2(Disk, C).
operator(hanoi, left_to_center(Disk), [[Disk|RestA], B, C], [RestA, [Disk|B], C]) :-
con2(Disk, B). % 移動先で制約2を満たしていることをチェック
operator(hanoi,center_to_left(Disk), [A, [Disk|RestB], C], [[Disk|A], RestB, C]) :-
con2(Disk, A).
operator(hanoi, center_to_right(Disk), [A, [Disk|RestB], C], [A, RestB, [Disk|C]]) :-
con2(Disk, C).
operator(hanoi, center_to_center(Disk), [A, B,[Disk|RestC]], [A, [Disk|B], RestC]) :-
con2(Disk, B).
operator(hanoi, center_to_left(Disk), [A, B,[Disk|RestC]], [[Disk|A], B, RestC]) :-
con2(Disk, A).

%-- 制約2
% 一番上にあるディスクよりも、小さいことを検査
/* ?- con2(2, [1,3]).
?- con2(1, [2,3]).

ここまでは作ったんです制約のところは
con2(X,Y) :-X > Y,con2(X,[Y|_]).と最初作ってみたのですが
| ?- search(hanoi,S,G,P,A). と聞いてもnoと答えられたので詰まってしまいました・・・。

427:デフォルトの名無しさん
09/07/22 08:25:39
突っ込みどころに目移りしますが、とりあえず…
>>426
> con2(X,Y) :-X > Y,con2(X,[Y|_]).と最初作ってみたのですが

その定義では
?- con2(1, [2,3]).
としたとき、1 > [2,3] という(規格上は)意味のない目標が実行されますよね。
Yとしてリスト(のみ)が与えられることを意識していないように見えます。

そもそも「一番上にあるディスクよりも、小さいことを検査」するのに、
なぜ再帰的定義を使おうと思ったのでしょうか。

428:デフォルトの名無しさん
09/07/22 10:20:15
質問です
学校の宿題でナンプレ(数独)を解かないといけないんですが
この言語肌似合わなくて今だにさっぱりです
できれば答、ダメなら方向性だけでも教えてください

429:デフォルトの名無しさん
09/07/22 10:53:02
>>428
肌に合わないなら無理してPrologで解く必要は無いよ。
自分に合った言語を使えばいいんだから。

Prologを使う事も宿題の前提の一つならあきらめなさい。
神様や天才じゃないんだからあきらめることを学ぶのも勉強。
だまには宿題ができず先生に怒られるのもいいでしょ。

それが嫌なら、まずは自分でできるところまでPrologで挑戦して、
できなかったところを具体的に自分の言葉で表現してみて。
そうすればスレの住人も返事のしようがある。

430:デフォルトの名無しさん
09/07/22 11:43:31
prolog使うのも条件なんです
最終レポートなんで出さないのはちょっと…
c系列なら二次元配列で表して左上はじから数字を当て嵌めてダメならバックトラックで出来ると思うんですがprologでそれをどうやっていいのか見当がつきません。
ヒントだけでもお願いできませんか?

431:デフォルトの名無しさん
09/07/22 11:58:02
あきらめなさい

432:デフォルトの名無しさん
09/07/22 12:01:51
理解してないくせに単位だけ取ろうなんて図々しいよな。

433:デフォルトの名無しさん
09/07/22 12:02:16
>>430
URLリンク(nojiriko.asia)

434:デフォルトの名無しさん
09/07/22 12:17:12
すみませんご迷惑かけました
>>433
ありがとうございます。みてみます。

435:デフォルトの名無しさん
09/07/22 12:22:10
まあまあ、俺も学生時代そんなんだったし興味ない言語に縛られるのもやでしょ。
特にCとかになれた人ならprologちょっとつらいしね。
この辺みれば良いんじゃないかな
URLリンク(kaz.cyteen.nagoya-bunri.ac.jp)

436:429
09/07/22 12:57:12
>>430
「Nクィーン問題」というパズルは知っているかい?
数独と同様、マス目にクイーンを「あるルールのもとで配置する」というもの。
非決定性プログラミングとか全解探索問題の定番といっていいほど有名なパズルだから、
Prologの教科書を何冊かあされば(あるいはググれば)コード付きで解説されてるはず。
まずは、このパズルの解法を完璧に習得してください。
これまでの講義をまじめに受けていれば理解できるはず。
もし理解できなかったらあきらめなさい。最終レポートにもなってあわてても遅すぎる。

次に、数独はNクイーンの応用問題だから、応用するうえでのヒントを。
まず最初の数字の配置を exist(Y,X,N) で表現する。YとXはマスの行番号と列番号、
Nは置かれている数。Wikipediaの例であれば、以下のようになる。(一部だけ)

exist(1,1,5). /*「1行目の1列目には5が置かれている」という事実 */
exist(1,2,3).
exist(1,5,7).
exist(2,1,6).
exist(2,4,1). /* 以下、省略 */

あとは、
(1) <1,1>から<9,9>までの範囲内で、上記の事前配置に含まれない(つまり空のマス目の)
 対(つい)を「生成」する述語
(2) 配置したい1から9の数を「生成」する述語
(3) 事前配置(制約)のもとで生成した空きマス(1)に生成した数(2)が配置可能であることを
 「判定」する述語 --> これが数独のルールの実装になる
を定義していく。

437:デフォルトの名無しさん
09/07/22 19:46:57
>>426
> %-- 制約2
> % 一番上にあるディスクよりも、小さいことを検査

「一番上に今置こうとするディスクXよりも、その下にあるディスクYがすべて小さいことを検査」
と、強引に変形してみると、心なしか

> con2(X,Y) :-X > Y,con2(X,[Y|_]).と最初作ってみたのですが

これに近くなる。なんていうエスパー解釈はダメでしょうか…
(Yを半ば集合的にとらえるところがミソ。[Y|_]がどこか投げやりであることにも符合)

438:デフォルトの名無しさん
09/07/22 19:48:35
>>427さん
再帰のプログラムばかり作っていたのでつい・・・。
initial_state(hanoi, [[1,2,3],[],[]]).
goal_state(hanoi, [[],[],[1,2,3]]).の部分の数が4,5,6・・・と増えても使えるようにしないとなーとなんとなく
考えてたので再帰的に作っていました・・・。

自分の中の考えとしてはXという値とリストの先頭にあるYを比べて
って・・・・書いてる途中で気づいたんですがX > YではなくてX < Yでした・・・。

しかしそうすると>>421さんの作ってくれたプログラムを当てはめれば動くはずなのに
エラーが出てしまうのはなぜなんでしょう?
Rが定義されていないみたいなエラーだったのでBの後ろは_として実行もしてみたんですが・・・。
理解力いまいちですいません



439:デフォルトの名無しさん
09/07/22 20:18:55
>>438
> Rが定義されていないみたいなエラーだったのでBの後ろは_として

この行動の説明ができれば疑問はないような気が。

これはこれでいいとして、問題は「エラー」(ではなくて警告だと思いますが)なのか、
期待通り動かないことなのか、なんだかよくわかりません。

440:デフォルトの名無しさん
09/07/22 21:19:40
一応紹介
URLリンク(www.sken.biz)
> 節内で他に共有されていない変数について、Prologが気をきかせて知らせてきています。
>
> 無名変数(_で始まる変数)にした方がよい場合もあるし、「変数名を書き間違えていた」という場合もあるでしょう。

ただし「(_で始まる変数)」は余計ですね

441:デフォルトの名無しさん
09/07/22 21:21:53
いや、余計ではなくて「(または_で始まる(無名でない)変数)」と言い換えるべきなのかも

442:デフォルトの名無しさん
09/07/23 00:29:35
>>440さん
[R] - singleton variables in user:con2/2
と出ているのでRは定義されてないよ〜って言ってるんだと思うんですが
どうなんでしょう?

443:デフォルトの名無しさん
09/07/23 00:46:54
>>441
_X でも警告されるんじゃ婦負の? SICStus のことはよくわからんが。

444:デフォルトの名無しさん
09/07/23 05:59:29
>>442
R のように節のなかで一回しか使われていない変数は虚変数といって、
実効がありません。実は変数名の付け間違いという可能性が高いため
処理系からWarningがでますが、Prologの仕様としては、エラーでは
ありませんし、Prologのプログラムの中ではそんなに珍しいものでも
ありません。全く気にすることのないものです。

445:デフォルトの名無しさん
09/07/23 06:07:46
実効がないと書きましたが論理的に実効がないと言う意味であって、
[A|R] ではなく [_一番上の円盤|_それより下の円盤の重なり] だったら、
ドキュメントとしての実効はあります。こんなアクの強い事例は少ないで
しょうが、多少のニュアンスを残すために虚変数はよく使われます。

446:デフォルトの名無しさん
09/07/23 06:21:26
>>443
single_var_warningsというPrologフラグの説明によれば
> variables not beginning with `_' occurring once only
というのが警告対象なので、_から始まるものは除外されているね。
確かに昔SICStusを使ったときそんなで、利用した覚えがある。

「don't care variable」という言い方があるらしい

447:デフォルトの名無しさん
09/07/23 06:22:54
>>442
違います

448:デフォルトの名無しさん
09/07/23 06:54:42
>>442
初心者はその警告を無視しないほうが無難だと思います。

449:デフォルトの名無しさん
09/07/23 07:01:39
>>442
つまりまとめると、>>421を書いた人は「一度しか現れない変数は間違いの兆候とみなされる」という原則を
意図的に無視したか、単に動作確認せずに書いて自己弁護しているかw、
ということでしょう

450:デフォルトの名無しさん
09/07/23 07:35:56
>>449
なんでそんなことが長々話題になってるのか解りません。
私の処理系ではWarningも出ないだけです。

451:デフォルトの名無しさん
09/07/23 07:57:19
それはなおさら興味深いじゃないですかw

452:デフォルトの名無しさん
09/07/23 08:10:09
>>448に補足すると、
「一度しか使っていないことに気づかなかった」こと自体はどうでもよく、
単に「意図せず食い違いが生じた」ことを浮き彫りにするための手段になるということです。

453:デフォルトの名無しさん
09/07/23 08:11:09
>>451
ごめん。IF/Prolog自体はconsult時にWarningを出してました。
私のはもう一層上にインタプリタが被っているので。
というより、ご指摘どおり、今やってみただけで、処理系での動作確認などは
確かにしていません。
ただ、この話は私の書いた >>444->>445 に尽きると思いますが。

454:444 445 453
09/07/23 08:39:20
済みません。間違ってたかな・・・
虚変数というのはトップレベルになくてはいけないという定義だったかも。
cons3(A,B,C) :- A < B. の場合の C は虚変数だが、
cons3(A,[B|C]) :- A < B. の C は虚変数ではない、かな。
トップレベルってそういう解釈でいいのだろうか。

455:デフォルトの名無しさん
09/07/23 14:58:39
虚変数という言葉は初耳ですが、要するに、
名前をつけただけで呼ばれることがない変数(の実体)は、
実行中に名前を覚えておく必要がない(「環境」から除外できる)ということでしょう。

456:デフォルトの名無しさん
09/07/23 15:04:39
いや、「名前」の問題だけではないか。
とにかく一定の処理を省略できるという特質があるということでは。

457:デフォルトの名無しさん
09/07/23 15:16:38
anonymous variable(「無名変数」、まれに「匿名変数」)の別名として、
void variableという、「虚変数」に近い言い方があるみたいですね。

458:デフォルトの名無しさん
09/07/23 15:31:17
>>454
なるほど、複合項の一部に持たせるときはその記憶領域が必要ですね。
某処理系のあのバグの本質はそういうことだったのか。。
勉強になりましたw

459:デフォルトの名無しさん
09/07/23 15:53:48
p(X) :- Y = [H|T].

460:デフォルトの名無しさん
09/07/23 23:55:54
>>446
ども、ありがとうです。>>445 みたいに使うのかな。

コメントでもいいような気もするけど。

461:デフォルトの名無しさん
09/07/24 09:06:42
よく考えると、自分が利用したのは、
?- findall(_X,( _X = a ),L).
のように問合せの中に使って、成功時に値を見なくていい変数であることを示す、
という効果だったような…。それは別の処理系だったかな…。

462:デフォルトの名無しさん
09/07/24 23:42:30
亀レスすいません>>438です
>>437さん
レスがかなり遅れて申し訳ないです
ちょっと違いますがそういう解釈してました

>>442で質問した[R] - singleton variables in user:con2/2
は皆さんが教えてくださったとおりwarningメッセージで実行には問題なかったです
それとnoと出ていた件についてなんですが
どうやら>>424さんが質問してきた部分が上手くいっていなかったので
noといわれていたみたいです
con2(A,[B|_]) :- A < B.
con2(A,[]).
としたら一応は解は出たのですがなんだかループしている気がします・・・。
バックトラックを何回やってもnoにならない・・・。
ハノイの塔の3つのとき方ってそんなにあるんですかね?

463:デフォルトの名無しさん
09/07/25 00:42:28
>>462
> ハノイの塔の3つのとき方ってそんなにあるんですかね?
無限にあるよ


464:デフォルトの名無しさん
09/07/25 09:13:10
initial_state(hanoi, [[1],[],[]]).
goal_state(hanoi, [[],[],[1]]).
で考えると、

左→右
左→中→左→右
左→中→左→中→左→右
左→中→左→中→左→中→左→右


こうなるんじゃないかな

465:デフォルトの名無しさん
09/07/25 09:18:10
節の並べ方によっては
左→中→左→中→左→中→左→中→…
と止まらなくなるおそれもあったのでは

466:デフォルトの名無しさん
09/07/26 01:00:08
>>462です
15手順目位までは特に変わりは無かったのですがその後が変わっていってました
手順は20とか23でとまっていたので手順が雪だるま式に
増えるわけではないみたいです

467:デフォルトの名無しさん
09/07/26 02:38:21
手元でやってみたら1872通りと出た。

URLリンク(www.research.att.com)
> 1, 2, 12, 1872, 6563711232, 282779810171805015122254036992,
というような数列になるらしいよ

468:デフォルトの名無しさん
09/07/26 11:11:17
>>467さん
( ゚д゚)・・・・

みなさん長々とありがとうございました

469:デフォルトの名無しさん
09/08/02 23:54:24
URLリンク(okwave.jp)
> quicksort([A|B],C) :-

> MLの説明に載っていたので、まさかMLでなくPrologだと思いませんでした。
> 助かりました。

気になる…
質問者の勘違いなのか説明の間違いなのかが気になる…

470:デフォルトの名無しさん
09/08/05 01:08:15
Prolog は凄いな。

複雑な式
A is B + foo(C * D) / 2
がそのままデータとして扱えるなんて。

新たな演算子を自分で作れるのも、
それを組み合わせて新しい文法が定義出来るのも
(危ういと言えば危ういけど)凄いと思った。

LISP よりも Prolog の方が DSL 作るのに向いてるかも。

471:デフォルトの名無しさん
09/08/05 01:16:21
むしろProlog自体が異様に応用力の高いDSLなんじゃ、と思うことがある

472:デフォルトの名無しさん
09/08/05 16:53:08
SWIなら「=..」なんていう反則述語もあるし

?- findall(A,hoge(A),AList)
or
?- hoge(A),fail.

でhogeが成り立つAを全部持ってこれるバックトラックの便利さも異常
それに、計算量を無視するならとても綺麗に書ける

473:デフォルトの名無しさん
09/08/05 17:50:47
>>472
=..(univ)はISO標準ですよ

474:デフォルトの名無しさん
09/08/05 17:53:17
>>473
マジでw
もはや一階述語じゃないISOなのかw

475:デフォルトの名無しさん
09/08/05 18:56:08
制約(constraint)を扱える処理系ってどんなのがありますか?


476:デフォルトの名無しさん
09/08/05 18:58:12
>>475
SWI-prolog

477:デフォルトの名無しさん
09/08/05 21:54:25
>>474
=..は一階述語ですよ

478:デフォルトの名無しさん
09/08/05 22:58:18
>>477
あの述語自信はそうかも知れないけれど、
あの効果を許すとそうでなくなるのではと。

述語を作れる述語でしょ。

479:デフォルトの名無しさん
09/08/05 23:25:25
>>478
univは複合項とリストを単一化するだけで述語を作ったりはしませんよ

480:デフォルトの名無しさん
09/08/06 00:13:57
>474はfindallが一階述語じゃないこともわかってない気がする

481:デフォルトの名無しさん
09/08/06 01:42:14
「述語を作る」という言い方は、微妙にややこしい。
論理式を作るのなら、Goal = p(X,Y)、Clause = (p :- q)などでもできる。
項と論理式を表面上区別しないから。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4808日前に更新/227 KB
担当:undef