Prolog初心者のスレ
これは良い言語だ…
探検
【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2010/11/06(土) 13:00:56384デフォルトの名無しさん
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というような名前の変数を
持ち回ったりしたのも、変数の数を減らしたいという理由も少しはあったと思います。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 [蚤の市★]
- 地震 [Hitzeschleier★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 [蚤の市★]
- 【話題】好きな鍋は?! 「寄せ鍋」「キムチ鍋」「水炊き」「もつ鍋」「豆乳鍋」「ちゃんこ鍋」「ごま坦々鍋」「トマト鍋」 [ひぃぃ★]
- 【STARTO ENTERTAINMENT】SUPER EIGHTの横山裕、フジ『ドッキリGP』ロケで全治2ヶ月の重傷 [Ailuropoda melanoleuca★]
- 【地震】 茨城 栃木 埼玉 千葉 震度4 [KingFisherは魚じゃないよ★]
- 台湾「韓国との関係を全面的に検討し直す」表記巡り最後通牒 台湾・高市枢軸で宣戦布告か🇯🇵 [399259198]
- J( 'ー`)し「で、アンタなんで働かないの?」 ワイ👶「理由は2つありまして~」🏡
- ムミィ🥺いる❓🏡
- おさかなさんあつまれえ
- ナマポなんだけど焼肉奢ってほしいのだ!ボーナス出たんだべ?
- 自民党、金融所得課税30%で決定か。株を売ったり、配当金が入ると国が30%持って行きます [838847604]
