[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 06/06 03:19 / Filesize : 222 KB / Number-of Response : 726
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【論理】Prolog【初心者】



1 名前:デフォルトの名無しさん [2010/11/06(土) 13:00:56 ]
Prolog初心者のスレ

これは良い言語だ…

357 名前:デフォルトの名無しさん mailto:sage [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のコードだと全体が一様で問題の構造が
みえずらいね。

358 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 13:33:08.64 ]
Haskellだっけそれ。whereいいなぁ〜

359 名前:デフォルトの名無しさん mailto:sage [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.


360 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 17:28:25.55 ]
Prologが代表的な関数型言語に較べて若干冗長になるのはやむを得ない。その代わり、

findall(Sub,(append(_,[N1,N2|_],L),Sub is N2 - N1),L1),

のようなコードで楽しめる。

361 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 18:37:08.11 ]
そのコードのどこが楽しいか教えてくれ

362 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 19:03:03.16 ]
>>361
N1,N2が対になって左から右に移動する。そういう視覚的なところ。

363 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 21:37:06.68 ]
冗長なのはいいけど、わかりにくいのは何とかしたいな。

人にもよると思うけど、>357と>359を比べると個人的には>357の方が
頭のスタック使用量が少なくて理解しゃすい。


364 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 22:19:54.19 ]
>>363
findall/3は事実上SQLのselectだからそういうコードに慣れている人には
全然分かりにくくない。>>362とは違った見解を述べると、変数の束縛とその解放と
いうPrologの特長がfindallという枠組みのなかで明示的なバックトラックなしに
巧みに現れているという点で面白いと思う。
もうちょっと専門的にいうと、member/2ではできないことがappend/3で実現できている
というところが味噌なんだけれど。


365 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 22:24:07.98 ]
     ____    ━┓
   /      \   ┏┛
  /  \   ,_\.  ・
/    (●)゛ (●) \
|  ∪   (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /




366 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 22:35:49.05 ]
うん、どうみても>359の方がわかりやすいな。
findAllも使ってるし。

367 名前:デフォルトの名無しさん mailto:sage [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の方がスーパーで
あることを如実に示す例ということ。

368 名前:デフォルトの名無しさん mailto:sage [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で書くとどうなるの?

369 名前:デフォルトの名無しさん mailto:sage [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する。一回真になる度に
第一引数に指定された項をリストに積んでいく。第二引数が最終的に偽になったら
リストの収集を必ず成功裏に了える。積み終わったリストは第三引数と単一化される。


370 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:12:52.32 ]
>>369
おお、すごいなあ....
findall/3にはこんな使い方があるんだね
勉強になったよ

% >>368とは別人desu

371 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:18:42.22 ]
>>369
ありがとうございます
memberとfindallの挙動とにらめっこしてたらだんだん分かってきました
ちなみにこれはリストの処理方法として一般的なコーディングですか?
大学の演習では習わなかった、というかrubyのArray#mapすらやり方が分からなくて困惑してました(笑

372 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:42:44.59 ]
>>371
最近はこの記法を使うことが多くなりました。万能ではありませんが、
この方が宣言的に読むことができる場合が多い。
>>357が指摘されているように、再帰的な定義が読みやすい宣言的な
定義であるとは限らないのです。

注意するべき事は、第二引数に来るSubgoalが非決定的な述語で
あるという点です。述語を定義するときに決定的に定義するか、
それともできる限り非決定的に定義を作って置くかいうことに成ります。
Prologの良さを引き出すためには、非決定的な定義をするスキルを
上げて、積極的にそのような定義をしていく方がいいようです。

373 名前:369 mailto:sage [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のような定義を省略します。こうすることによって再帰定義の
繰り返しをひとつ回避してほんの僅かですが宣言性を高めようと
しているのです。

374 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 09:43:08.70 ]
>>373
そうではないと思う。add_1/2が非決定性の述語と定義されているから
あるいは、定義することに決めたから、findall/3が必然になったのだ。
データ構造の設計で、リストからリストへと展開することを基本とする
なら、再帰述語中心の定義になるだろうし、
Prologの基本はデータベース述語(単位節)であって本質的に非決定性で
あることは避けられないという立場からの設計なら、集約述語である
findall/3の使用は必須のものとなる。
宣言性の強弱は確かにあるが些細な差であって、より重要なことはこの
ような設計上の差異である。


375 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 11:34:15.70 ]
prologは非決定性を持つといえるのか?
非決定性というが、prologの場合、結果は順序まで含めて決定的。
この点ではSQLはまだ非決定性を持つが、結果を集合として考えるならやはり
決定的かな。

それと、単位節は要するに表でRDBと同じ。
その意味では、prologをprologたらしめているのは、単位節以外にあるといえる。




376 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 13:05:16.05 ]
例えばAとBとCという概念があって,これら単体ではPrologの本質とは言えないが,
これらの概念の組み合わせ方が本質だったりする場合があるので,
そういう場合は、AやBやCという概念を持ついろんなモノをまとめて表にしていくとぼんやりと見えてくる.
メンデレーエフが周期表を発見したときのように.



377 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 17:39:13.48 ]
>>375
Prologは非決定性モデルを、仕様の表に出さない決定的プロセスによって実装している
この立場に立つ人は、Prologでは、解の出現順序が決定的でなければ困るような問題を扱ってはならない

これの一番の利点はモデルを考えるとき(つまり論文を書くとき)に解を普通の集合として取り扱えること

逆に言うと、Prologの実装の決定性に依存するような問題を考えるときにはPrologの利点はなくなり、かえって実装が複雑になる
(もちろん、どんな問題であれ、解を効率的に見つけるというアルゴリズムを考えるときにはPrologの決定的な側面を厳密に考慮しなくてはならない)

378 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 20:01:37.69 ]
prologの言語仕様は、解の出現順序を決定的に定義してたと思う。
ISOの規格文書が見つからないので引用できないけど。

379 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 20:13:59.14 ]
ISOのWebサイトは見づらすぎるね
こちとらAdobe Readerなんてはいってないんだよ

380 名前:379 mailto:sage [2011/12/11(日) 20:15:03.51 ]
ごめん入出力はISOなのに脳みそはJISと認識してたわ

381 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 06:57:02.61 ]
>>375
Prologの単位節はもうこれ以上、書き換えることのない、どん詰まりの情報だ。
中島秀之氏はこれをプリミティブなものと表現したが。
RDBは列ごとに集合を表すが、Prologの単位節の引数にそういった意味合いは
まったくない。あくまでRDBに模して(RDBとの親和性といった)、引数部分に情報
を配置することが可能というだけ。
Prologのプログラムとはこのどん詰まりに導くためにルールが書かれていると
解釈できるのであって、どちらがPrologの根幹かなどと問うこと自体無意味だ。

382 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 07:03:09.67 ]
RDBの正規化もどん詰まりの情報では?
意味合いを持たせる持たせないの話なら使い手次第では?

383 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 07:26:04.30 ]
>>382
RDBの正規化とProlog項記述の関係については「考えたこともない」状態なので
俄にはまともな返信ができません。

384 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 07:43:31.73 ]
>>381
どちらにというとそうだけど、帰納論理プログラミングなんかは、
明らかに具体的な情報を基礎にルールを見つけて組み立てるという
方向のアプローチですね。そういう方向性のようなものは個々の
Prologプログラマの中にもあるということではないか。Prologを
証明器として捉える人は、ルール重視になるだろうし。


385 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 08:13:19.07 ]
prologをデータベース代わりに使う人は
単位節を主として、ルールを副と考えるよね。
このスレには昔から「prologの根幹は単位節」と唱える人がいるみたいだし。
それはprologの、ではなくデータベースの根幹だといつも思う。




386 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 08:55:46.87 ]
>>385
ルールだけでは成立しない一方、単位節だけでPrologプログラムが
成立してしまうということも言えるのではないか。

387 名前:385 mailto:sage [2011/12/12(月) 09:00:11.78 ]
>>386
ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。

388 名前:386<- ここをまちがえた mailto:sage [2011/12/12(月) 09:01:39.56 ]
>>386
ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。

389 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 09:28:02.13 ]
内包と外延が近い表記法でバランスよくプログラムに記述できる
ところがPrologの大きな魅力だ、というくらいでいいんじゃないか。


390 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 12:59:25.07 ]
よく分からない。

ボディがtrueのルールがファクトなのでしょう?
ルールはファクトを包含しているのでしょう?
なら節は全てルールだけと言えるでしょう?

仮にファクトだけで成立するならそれは命題論理であって、一階述語論理ではない、つまりPrologではない。

391 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 16:09:09.71 ]
>>390
それだと、
先祖関係にはルールがあって、なぜ、親子関係には
ルール(本体)がないの?という問に答えられないよ。


392 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 16:33:00.97 ]
>>375
棄て去った解候補の順序が決まっているかどうかなんて関係あるかな。

393 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 15:55:43.43 ]
Prolog Cafe 1.2.5で
| ?- frend(taro,hanako).
{EXISTENCE ERROR: procedure frend/2 does not exist}
| ?-
などといわれます。このエラーは何ですか?


394 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 19:29:31.30 ]
>>393
節データベースにfriend/2が存在しないという意味。
assert(frend(taro,hanako)).
と入力すれば節データベースに追加される。
確認するには、
listing.
と入力する。

assertせずにソースファイルから節データベースに読み込む場合は、
['hogehoge.pl'].
と入力する。

395 名前:デフォルトの名無しさん mailto:sage [2011/12/15(木) 07:59:20.08 ]
>>393
friend(taro,hanako).
と定義されているのではありませんか?



396 名前:デフォルトの名無しさん mailto:sage [2011/12/21(水) 11:28:06.93 ]
データが基礎であり、則ちデータベースが基礎である。 そのデータベースを最も自然体で保持できるプログラム言語は Prologである。これだけで十分で、特に単位節がPrologの基本 などと云う必要もない。

397 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 00:30:36.61 ]
Prologは関係データベースと演繹データベースの派生として解釈できる
しかし、Prologはデータベースが基礎であるというのは言い過ぎ
理由は、永続的に記録できるデータはソースファイルに書いた分だけで、稼働中に追加されたデータはただちに消えるか、Prologの仕様にない方法で記録するしかないから

Prologをデータベースというのなら、C言語もデータベースということになる
C言語の方はさらに表現能力が高い演繹データベースということになる

398 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 05:14:48.50 ]
>>397
Prologをオンメモリデータベースシステムとして捉えたら欠点だらけと
いうことになる。ここでも指摘されているが、assertzが無闇と遅く、
初期状態の回復に時間がかかる。節順序を指定してのUPDATEが
できない、等。しかし、現実にはそれを補強しながら使われている。
Prologのデータベースや単位節を強調した話題は、全部態度表明。
オブジェクト指向の初期に差分プログラミングが強調されたようなレベル。

399 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 07:12:56.08 ]
>>397 Prologデータベースについては、単一レベル記憶的なイメージの 実現を夢見るのが一番ハッピーなのではないか。あまり永続性に 拘るのもいかがなものか。その昔、コアメモリなんてものもあった。

400 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 16:21:20.36 ]
停電したらどうしようという話でしょ。


401 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 16:27:24.34 ]
なんか話がループしてるような気がする。
暇なひとはマインドマップでも書いて見ると良い。
もちえん枝葉にはそれぞれ議論があるだろからきれいな図にはならず、
きっと面倒だろう。

402 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 17:15:31.47 ]
>>400
データベースとして使う時はPrologサーバーとして使うから、
トランザクションの度に子プロセスを生成して、そこにコピーが
できるわけだから、保存ファイルにlistingするのではないかな。

403 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 14:13:21.25 ]
Prologをデータベースとしてとらえたときに、特に優れている点は、複数の関係のJoinしたときのパターンマッチングの速度の速さ
特に劣っている点がデータの更新と永続性

404 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 17:32:27.27 ]
節の定義順を維持しようとすると、全ての節を一度retractしなくては
ならない。ここらあたりの基本動作は改変しないと本格的なデータベースには
使えない。
最低限、節の定義位置の相対番号によりretract/assert指定は可能にする
必要がある。

405 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 17:39:41.47 ]
それから、永続性の問題の方は、オンメモリデータベース共通の問題だが、
停止したあとの再現が確実に行われる必要がある。現在はこれに使用する
ユーティリティの作成から全てをエンドユーザ任せの水準だが、Prolog処理系が
安全で安定した動作/環境を保証する必要がある。



406 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 22:41:14.94 ]
>>403
Joinってそんなに速かったっけ?
Oracleとかと比べたデータあります?

407 名前:デフォルトの名無しさん mailto:sage [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をデータベースとして利用するときには、データを定期的に走査して、データマイニング技術により、テーブル間の自然結合を高速にするホーン説をストックしている
(逆にいうと、データを頻繁に更新するときにはこの利点はまったくなくなる)

408 名前:デフォルトの名無しさん mailto:sage [2012/01/09(月) 06:09:35.01 ]
どこで無限ループおきてるかわからないときの
デバック方法みたいなものはないのでしょうか

409 名前:デフォルトの名無しさん mailto:sage [2012/01/09(月) 06:44:57.67 ]
>>408
www.swi-prolog.org/gtrace.html

SWI-Prologなら
gtrace, test_chat.
とかやるとステップ実行したり変数束縛やらコールスタックを確認できる。

410 名前:デフォルトの名無しさん [2012/01/15(日) 06:07:27.61 ]
LiLFeSの話題もここでいいの?

411 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 06:10:34.10 ]
>>410
勿論、歓迎だけど、わかる人いるかなぁ。

412 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 06:49:13.11 ]
>>411
レスが付かない場合は、twitterにここのスレへのリンクを貼ればいいんだよ。
#レス番号付きで。2ch嫌いでなければ結構答えてくれる。


413 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 21:44:26.43 ]
プログラムを中断して、その状態を保存しておいて、後で再開するにはどうすればいいのでしょうか?

414 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 17:13:47.54 ]
>>413
どう答えて良いか困惑するけれど、多分「そういうことはできない」というのが解だと思う。
この言語をそういうレベルで使ってはいけないし、サポートする組込述語もない。

415 名前:デフォルトの名無しさん mailto:sage [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いじくり回してるけど出来ない…



416 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 17:49:43.61 ]
>>415
パターンマッチで分岐すればいいだろ。

417 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 16:37:19.88 ]
>>415
list/1は組込述語になっている処理系が多いと思いますが定義するなら

list([]) :- !.
list([_|_]).


418 名前:417 mailto:sage [2012/01/30(月) 16:40:01.14 ]
>>415
まちがえました。
list(L) :- \+(var(L)),L=[].
list(L) :- \+(var(L)),L=[_|_].

でした。

419 名前:デフォルトの名無しさん mailto:sage [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).


420 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 16:53:29.64 ]
>>417 は意図して間違えたわけではなく、本当に間違えたのですが、
>>417 >>418 のような間違いと訂正が「残る」記述であるべきですね。
その点2chのような掲示板は大変よろしい。
書き換えられ、完成されたものには魅力がありません。

421 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 01:47:19.97 ]
>>415
↓のflattenが参考になる
www.geocities.jp/m_hiroi/prolog/prolog03.html

422 名前:デフォルトの名無しさん [2012/02/15(水) 05:18:36.92 ]
尾崎隆大ってこの世界では有名なの?

423 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 07:11:16.34 ]
>>422
本人ですが、全然有名ではないですよ。
少しPrologに貢献した時期もあったかも
知れませんが、それは1990年より前ですから。

424 名前:デフォルトの名無しさん [2012/02/16(木) 14:08:29.13 ]
本人だと・・・
雷電どういうことだ!?

425 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 14:11:21.62 ]
ぬぅ ま・・・まさか
まさかこの目で見ようとは



426 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 16:53:25.72 ]
知っているのか雷電!

427 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 17:29:56.16 ]
うむ

428 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 19:42:37.03 ]
つか本人が降臨しているとはな…ついったでお世話になってますお

429 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 07:51:51.38 ]
prologは再帰を積極的に用いてループを実現していますが。
趣向の域を出ない感じがします。
再帰でなければいけない論拠ってありますか?

430 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 08:23:32.80 ]
>>429
「Prologは」というところを「論理式では」と置き換えて読み直されることを
勧めます。

431 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 08:57:54.03 ]
>>429
www.amazon.co.jp/dp/B000JA2VJO
「プログラムの理論」 Zohar Manna著 五十嵐滋訳 を読んでみたら、
としかいえない。


432 名前:デフォルトの名無しさん [2012/02/17(金) 10:16:40.69 ]
Prologに限って云えば>>430が正解のような気もするが。
元々、プログラムが停止する(解を持つ)ことを証すための形式として、
再帰が選択されている。
多分>>429はチューリングマシンの計算表を基礎だとして、再帰はループに
変換できるのだから、再帰に終止するPrologは趣向ではないかとしたのだ
と思うが、正しいプログラムを書く一つの戦略として、再帰が選ばれている、
可能な限り再帰で書かせようとするプログラム言語が存在していると考えれば
いいのだろうと思う。


433 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 10:56:33.41 ]
>再帰はループに変換できる
その上で何故趣向と思ったかの一つは。
同じ処理をさせるにしてもは再帰はループよりかなり効率が悪い。
再帰中はローカル変数が解放されないのでメモリの資源効率が悪い。
それにともなって実行効率も落ちます。


434 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 11:00:39.29 ]
再帰をループに自動変換し中間言語を生成するようなアルゴリズムでも
あれば凄いと思うのですが、僕の知っているprologにはそんなものは無いようです。

435 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 11:02:20.28 ]
>>433
これはPrologだけに通用する話ですが、
単一化、バックトラックといった法外にコストのかかる処理を
絶対的な基本としていて、再帰とループの効率の差など、
最初から度外視している系です。



436 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 11:07:45.84 ]
末尾再帰をループに変換する処理系ならあるでしょ

437 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 12:27:27.38 ]
Prologだから論理プログラミングしなきゃいけないなんて誰が決めたんですか…!
あなたがかきたいようにかけばいいじゃないですかぁ…!


438 名前:デフォルトの名無しさん mailto:sage [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)に再帰処理を押し込んで、
その後を手続き的に処理するという手法はごく普通のものです。

439 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 17:45:06.40 ]
とりあえず末尾再帰最適化とか、
proper tail callとか勉強してくれ。> 再帰くん

440 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 17:59:36.65 ]
>>397
「Prologの仕様にない方法で記録するしかないから」
とあるけど、これはどういう意味なのだろうか。

441 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 07:24:48.76 ]
Prologの仕様のひとつにISO規格があるけれど、
あまり逸脱しないための枠組みくらいの意味しか
ない。そのくらい無視されている。


442 名前:デフォルトの名無しさん [2012/02/29(水) 07:32:27.54 ]
ISO規格の日本語訳が必要だね。それへのリンクをWikipediaの
冒頭付近に持ってくる。


443 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 07:34:51.94 ]
正式にPrologと名乗っていいかどうかを承認する機関とかあればいいけど
そこまでしてイソイソする需要もないんだし
どうしてもイソにこだわるならSWI-Prologとかならドキュンメントにイソってる述語かどうかかいてあるから
イソい述語だけ使うようにすればいいんじゃないかな

444 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 07:39:57.82 ]
イソい述語が貧弱すぎるのもダメなんじゃないかな。
最小限のイソの上にPure 100% Prologな述語を作りこんでいくって言う発想は
どうしても性能的に問題がでてくるでゲソ?
だからイソ述語を沢山定義していったほうがいいと思うの。
Level 1, 2, 3とか段階に分けてもいいかもしれんけどね。
レベルが高いほど高機能で低いほどよりプリミティブな述語なの。

445 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 07:40:28.74 ]
>>443
少なくとも日本ではSWI-Prologが標準に近い地位にあるから、
日本語訳するとしたら、こちらの方だろうな。



446 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 07:43:39.90 ]
そういえば、SWI-Prologのdoc_serverだっけ?
pldoc形式かなんかで書いたドキュメント文の末尾にピリオドが自動で付与されるから、
出力が「こんにちは。.」みたいな不恰好になっちゃうよね。

447 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 07:44:07.13 ]
もしかしてイカ娘さんの登場かな?


448 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 23:21:34.18 ]
初心者です。
Prologのソースファイルに
do :- ...
do.
のような記述がよくあるんですが、これってdoのbodyをdoでくるまずそのまま書いちゃだめなんでしょうか?

449 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 23:42:15.80 ]
>>448
具体的なコードをコピペしてもらえると、期待する答えがもらえやすいと思う

とりあえず可能性を推測してみる
・1行目のbody部では(たとえばバックトラックを応用した)手続き型の処理が書かれていて、
 必ず否定で処理が終わる
 でも、処理全体としては肯定で終了させたいから、2行目に必ず真となる述語が置かれている
・述語doに引数があり、複数のbody付き定義でcase文に相当する多分岐処理を記述している
 そして、最後のbody無しdoは(case文における)空のdefault節を表現している

450 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 00:04:25.78 ]
>>449
hlab.ta.chiba-u.jp/article.php?story=20090206114807903
このコードです。まったくの初心者なので支離滅裂なことを言っているかもしれませんが、
・initCells :- hogehoge.のあとinitCells.と書いているのでgoの中でinitCellsを改めて呼び出す必要はないのでは?
・initCellsは常に否定で終わるのに、goの中の以降の処理が実行されているのはなぜ?
というのが疑問です。

451 名前:デフォルトの名無しさん mailto:sage [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定義が、常に肯定(真)を返すから

452 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 00:45:08.83 ]
>>450
以下のPrologプログラミング解説ページ内にある、
「繰り返し - 失敗駆動ループ」という節が参考になると思う

・M.Hiroi's Home Page / Prolog Programming
 www.geocities.jp/m_hiroi/prolog/prolog03.html#chap14

453 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 11:16:10.30 ]
>>451
理解できました。initCells.を対話シェルでの質問と同じように捉えていました。
あくまで引数なし体部なしの述語定義なんですね。

454 名前:デフォルトの名無しさん mailto:sage [2012/03/17(土) 20:48:38.00 ]
>>440
Prologプログラマが自分で勝手に作った構文でパーサやデコーダを作ってデータをテキストやバイナリに変換してファイルに書き込む
という意味

455 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 05:29:34.55 ]
>>454
現在のProlog処理系環境では、
listing と consult が最速。
clause や assert を使って
自前で処理すると遅くなる。

get_heap_vector 的な述語があるなら、
そういう可能性もあるだろうけれど。



456 名前:デフォルトの名無しさん mailto:sage [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).
(無限ループ)
となってしまいます。

457 名前:デフォルトの名無しさん mailto:sage [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で第二節、第三節で意図された定義は不可能です。


458 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 09:58:06.54 ]
解決方法

1. eqを述語でなく関数とする
2. XSBのような導出節をテーブル化してくれる処理系を使う
3. マジックセット変形する

459 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 07:28:43.08 ]
おはようございます
いま一筆書きゲームがブームですが
Prologで一筆書きを解けますか?

ただし上記ゲームには、一部の経路に
・一方通行
・必ず2回通る経路
があり
・ワープ1つ(一方の点に入ったら他方の点に強制ワープ。何度も使える。)
があります

460 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 19:24:15.07 ]
要はそういうプログラムを書けってことね

461 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 19:47:20.63 ]
学校の宿題は自分で考えたほうが本人の為になると思うな

462 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 21:13:34.63 ]
Prologで表現できるかできないかを聞きたいだけ
できるなら自分で作るし
できないなら他を当たる

463 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 21:26:11.51 ]
できない場合はできない理由を添えて提出する、までが宿題です

464 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 21:27:57.77 ]
>>462
>Prologで表現できるかできないかを聞きたいだけ

一言で言えば、「できる」

もし本気で知りたいと願うのなら、"一筆書き Prolog" でグクるくらいのことはやってみろ
その上で、Prologのプログラミング技法に疑問があれば、このスレで問えばいい

もしPrologにおける全解探索の一般的な表現(プログラミング)を知りたければ、
たとえば以下のサイトが参考になる(特に、パズル解きに興味があるヤシには最適)

・お気楽 Prolog プログラミング入門
 www.geocities.jp/m_hiroi/prolog/

465 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 21:30:08.50 ]
計算量はどうでもいいならできるだろ。
AとBがワープ関係のとき、A→B→Aのような無意味なループを発生させる経路を省けば、経路は有限だからな。総当りでいける。



466 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 21:31:38.06 ]
チューリング完全

467 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 06:57:33.70 ]
>>462
私は昨日早速その問題をやってみようと思って始めたのですが、
ワープの意味がよく分からず止めました。多分、検索すれば
わかりやすい説明が見つかるのだろうけれど。

Prologにできるか、できないか、ということになると、できる。
できるどころか、何をやってるいるかを明確に示しているか
という観点で評価するなら、全てのプログラム言語の中で、
最上のコードが書けるだろう。

468 名前:459 mailto:sage [2012/03/23(金) 07:55:58.05 ]
おはようございます。
ワープを図で説明してみます。一筆書きの一部を切り出した図:
    C…       D…
    │        │
A─ワープX===ワープY─F…
    │        │
    B…       E…
・ABCのいずれかからワープXに入ると、強制的にワープYに移動させられる。
 次の手ではDEFのいずれかに移動する。
逆に、
・DEFのいずれかからワープYに入ると、強制的にワープXに移動させられる。
 次の手ではABCのいずれかに移動する。

>>465 が言うようにワープX→ワープY→ワープXのようにループすることはない、です。
>>464 のサイトは既に見てました。パズルに興味があるので確かにおもしろそう。

469 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 14:54:58.78 ]
ワープは一方通行を使って表現できる

470 名前:デフォルトの名無しさん mailto:sage [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).


471 名前:470 mailto:sage [2012/03/27(火) 14:48:24.49 ]
%
% 一方通行のみ
% 一回通行のみ
% ワープなし
%

でした。

472 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 14:56:33.93 ]
多分この問題、双方向なのにどちらかの方向一回しか利用できない、
ということの定義の仕方が難しいのでしょうね。

節に入っているみちの中で、一方通行がひとつだけ。このひとつがワープかな。

ワープを宣言して、他の一方通行の定義を排除したいですね。ということは、
筆のみちを定義する部分から、プログラムとした方がよさそうです。

473 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 15:07:58.93 ]
>>472
節に入っているみちの中で、一方通行がひとつだけ。このひとつがワープかな。
この部分違いました。

ワープはその他に複数回の使用が可能という規則があります。

一回使用のみは[_], 二回使用可は [_,_], で表すとしたら、この無限大に近いワープは
どう表現しましょうか。変数のままにしておきましょうか。

途中既に使用したみちであるかどうか \+(member([_節,_隣],L1)), で検査していますが、
ここで使用可能数を示すリストの要素をひとつ削ることになりそうです。

474 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 15:09:50.17 ]
>>473
また間違えた。 \+(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にならないのは何故なんでしょうか



476 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:59:37.55 ]
prologで変数名や術語名にL0とかfoo0とか数値を末尾に付けるのはどういう規則でつけてるんでしょう?

477 名前:デフォルトの名無しさん mailto:sage [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は数字が嫌いですから。

478 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 03:30:41.37 ]
とにかく遅い,原理的に遅くならざるをえない,に限る.ぷろろのけってんは

479 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 11:41:29.67 ]
>>478
遅いと云っても、たかだか数百倍だよ。

480 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 22:48:59.62 ]
>>479
p :- q1,q2.

q1.

q2.

のような引数のない述語だったら、インタプリタでも全然遅くない。
まして、コンパイラなら。


481 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 13:49:04.02 ]
>>478
パターンマッチだけに注目するなら、他の言語よりも圧倒的に速い
例えば、ルールベースの条件文のマッチングとか

482 名前:デフォルトの名無しさん mailto:sage [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))).

となってとっても読み易いと思うのですが。


483 名前:デフォルトの名無しさん mailto:sage [2012/06/06(水) 16:44:31.68 ]
>>482
そうですね。私などは徹して、引数はアトム、変数で構造体はリストだけを許しています。
これは私の流儀であり、すべてのプログラマがそうであったり、何か規則でそうなって
いるわけでもありません。わかりやすく、かつ、安全なプログラミングのためには、それが
鉄則と思っているだけです。OSのように、情報源と消費地が離れていて、しかも、停止し
ないプログラミングでは持ち回る引数が多くなりすぎるということは確かにあります。
かってのPrologマシンでオブジェクト指向を採用し、Objectというような名前の変数を
持ち回ったりしたのも、変数の数を減らしたいという理由も少しはあったと思います。

484 名前:デフォルトの名無しさん mailto:sage [2012/06/06(水) 16:57:30.24 ]
それで、引数が10個以上にもなってしまう時はどうしているの?という話になるわけですが、
率直にいって、諦めるというのが答えですね。そういうクラスの述語をできるだけ書かなくて
よいように設計する、としかいいようがありません。

485 名前:デフォルトの名無しさん mailto:sage [2012/06/06(水) 21:22:31.39 ]
> 引数はアトム、変数で構造体はリストだけを許しています。
> (中略)
> わかりやすく、かつ、安全なプログラミングのためには、それが鉄則と思っているだけです。

これはどういう理由なんでしょう?
リスト以外の構造体を使うと「わかりにくい」「危険」なのでしょうか?



486 名前:デフォルトの名無しさん mailto:sage [2012/06/07(木) 05:06:14.38 ]
>>485
この述語が正しく記述できたかは、それを読んでいる副目標の構造と、
述語の頭部を比較するのですが、その時に一瞥で正しさを判断する
ためには、スカラ型データが有利だということが一番大きいと思います。
引数に複合項があり、その中に変数が含まれる場合の判断は遅くなるし
難しくなります。関数名が助けになるのではないかとの質問でしたが、
関数名を適切に与えることは結構難しく、部分構造の後からの変更は
更に難しくなります。Prologが関数型言語と比較して優位なのはこの
ような関数の型評価をほとんど行わなわない、単純なユニフィケーション
に終始できる可能性にあると思っています。

487 名前:486 mailto:sage [2012/06/07(木) 07:04:46.96 ]
>>486
「それを読んでいる副目標」は「それを呼んでいる副目標」の間違いです。

488 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 08:58:20.35 ]
>>486
引数に複合項を避ける理由は、やはりPrologの定義節をRDBと見做しているか、
そうありたいと思っているから。これが大きい。


489 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 13:01:09.50 ]
単にパターンパッチングとの相性が悪いからだとも思える。

490 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 15:05:47.88 ]
>>489
フレームのような大きな構造の一部だけ変更してそれを次の引数として
渡すというような処理は苦手です。
破壊代入されませんから、構造の再構成が必須となります。


491 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 22:00:24.54 ]
しかし木構造をフラットに述語表現すると
親子のリンク関係を表すために人工的な識別子を導入する必要がある。
このように表現されたデータ構造は、もはや木構造であることが構文的に
保証されない。Cでポインタを用いる場合と同じような危険性が伴う。
複数の木を扱う場合には識別子の管理も面倒である。

492 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 22:49:48.34 ]
>>488
WANの都合ではなかろうか

493 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 22:51:23.00 ]
WAM

494 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 23:20:51.21 ]
つうか複合節はホーン節でないし。

495 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 12:14:05.74 ]
SWI-Prolog Editer を使うために32bit版のSWI-Prologをインストールしたんですが、
拡張子の関連づけをEditerのほうに変更するべきなようです。
アイコンが無関連の表示になっていたんですが、変更用のソフトを使ってみると、関連付けが食い違っていました。




496 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 13:06:52.54 ]
      ___   ━┓  ___    ━┓
     / ―  \  ┏┛/ ―\   ┏┛
    /  (●)  \ヽ ・. /ノ  (●)\  ・
  /   (⌒  (●) /. | (●)   ⌒)\       ____
  /      ̄ヽ__) /   |   (__ノ ̄  |   .   /  -- 丶、
/´     ___/     \        /   .  / ノ   ●) ヽ┏┓
|        \          \     _ノ     .|  (●, ,⊃ ノ ┏┛
|        |          /´     `\    .ゝ、  `´  .へ ・


497 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 14:19:53.34 ]
>>482
リスト以外の複合項で引数の受け手側が待ち受けるということはしませんね。一般的には
そちらの方が可読性が極端に悪くなります。
再帰の場合は、受取側の引数の並びと引き渡し側の引数の並びを一瞥して比較するという
ことがPrologプログラミングの仕事ですから、構造体があったのでは堪りません。
できれば、リストも避けたい。再帰さへできることなら回避したい。不要な繰り返しを
排除し、平坦に、平明さを追求するのがPrologではないでしょうか。


498 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 22:50:04.95 ]
可読性というのは読み手に依存する性質であるから、
特別な事情がなければ一般的な読み手が慣れ親しんでいる
書き方をした方が読みやすくなるといえる。

そして読み手の多くは、構造化データのようにものごとを階層化して
整理するやり方に慣れているということを考えると、複合項を適切に
用いることで可読性が向上すると考えるのが自然である。

余談だが、これは仮名遣いにしても同様である。

499 名前:デフォルトの名無しさん mailto:sage [2012/06/20(水) 13:04:54.67 ]
www.swi-prolog.org/pldoc/doc_for?object=exists_file/1

exists_file/1ってなんか英文法的におかしく無いですか?
file_exists/1ですよね?

500 名前:デフォルトの名無しさん mailto:sage [2012/06/23(土) 07:05:41.56 ]
>>499
私は知りませんが、述語+対象を原則としたところから始まったのでしょうか。
最初に concat_atom があり、後に atom_concat が生まれ、atom_concat に倣うように
atomic_list_concat が生まれる。こうなると訳がわからない。

501 名前:デフォルトの名無しさん mailto:sage [2012/06/23(土) 07:17:40.99 ]
concat_atomは第一引数のリストの中のアトムか整数を結合した長いアトムを第二引数にunifyする。
atom_concatは第一引数、第二引数のアトムを結合したアトムを第三引数にunifyする。
atomic_list_concatはconcat_atomと同じだが、アトムと、整数だけでなく浮動小数点を含んだ
数を公式に許した。歴史的事情によってこう命名されたのだと理解している。

502 名前:デフォルトの名無しさん mailto:sage [2012/06/24(日) 16:46:20.77 ]
>>492
ちょっと間が抜けた遅レスになったが、
ここの「WAMの都合」の意味がわからなかった。どういうことだか教えてください。

503 名前:デフォルトの名無しさん [2012/06/24(日) 17:51:51.91 ]
>>502
プログラマがWAMを意識してプログラミングするなんて考え難い。


504 名前:デフォルトの名無しさん mailto:sage [2012/06/24(日) 17:59:57.52 ]
>>502
Prolog処理系
JAVAのJVMみたいなもの

505 名前:デフォルトの名無しさん mailto:sage [2012/06/24(日) 22:50:43.44 ]
>>503
昔はみんな、グローバルスタックをできるだけ使わないようにしようとか
処理系の実装を意識してプログラムしてたよ



506 名前:デフォルトの名無しさん mailto:sage [2012/06/25(月) 12:31:32.85 ]
ノイマン型を意識ぜずにプログラム書く奴いるのか?
トイプログラムならどうでもいいだろうけど。

507 名前:デフォルトの名無しさん mailto:sage [2012/06/25(月) 12:53:57.00 ]
>>506
Prologプログラマでノイマン型を意識する人がいるかの意味なら、
いないでしょう。

508 名前:デフォルトの名無しさん mailto:sage [2012/06/25(月) 12:59:45.16 ]
>>507
スタックオーバーフローには注意するだろう。そのこととノイマン型と
どういう関係になるかは知らないが・・・


509 名前:デフォルトの名無しさん [2012/06/25(月) 13:40:09.16 ]
>>506
そんなこと考えたら。アウト! という世界だろ。


510 名前:デフォルトの名無しさん mailto:sage [2012/06/25(月) 16:18:25.34 ]
あらゆるジャンプ先のアドレスを意識してプログラミングする奴がいるか?

511 名前:デフォルトの名無しさん mailto:sage [2012/06/25(月) 17:32:32.37 ]
配列かリストか考えるだけでもランダムアクセスメモリのこと意識するんじゃね?

512 名前:デフォルトの名無しさん mailto:sage [2012/06/25(月) 18:55:26.23 ]
>>511
それは配列やリストの特性を意識するのであって、
メモリのことは意識してないのでは?

513 名前:デフォルトの名無しさん mailto:sage [2012/06/25(月) 21:33:57.47 ]
>>506
Prologの計算モデルを実装するマシンはノイマン型に限定されないと思う

514 名前:デフォルトの名無しさん mailto:sage [2012/06/25(月) 22:55:57.03 ]
データフローw

515 名前:デフォルトの名無しさん mailto:sage [2012/06/26(火) 09:24:55.29 ]
ノイマン型を意識する人は死ぬまで1コアマシンを使ってろw



516 名前:デフォルトの名無しさん mailto:sage [2012/06/26(火) 10:49:32.92 ]
マルチコアで内部的にシーケンサが複数になってもノイマン型の範疇での話。

517 名前:デフォルトの名無しさん mailto:sage [2012/06/26(火) 14:00:36.35 ]
VLIWでインターロックがなくっても(略
ベクトルプロセッサで(略

何を指摘されても、どうとでも言い逃れが可能な論理ですねw

518 名前:デフォルトの名無しさん mailto:sage [2012/06/27(水) 05:55:26.77 ]
ja.wikipedia.org/wiki/ハーバード・アーキテクチャ

519 名前:デフォルトの名無しさん [2012/07/20(金) 05:35:19.90 ]
>>20を見て気になったのですが、Prologは以下の内容のデータベース構築に向いているのでしょうか?
toro.2ch.net/test/read.cgi/tech/1341099441/265

520 名前:デフォルトの名無しさん mailto:sage [2012/07/20(金) 08:04:16.93 ]
>>519
テキストが1GB以下程度で全部メモリに納まるならば、最も向いた言語でしょう。
プログラム言語自体がデータベースですから、定義、変更、条件付けなどは簡単です。

>>20 はPrologを使い込んでない人の意見で、Prologが向かないのは、ユニフィケーションの
繰り返しが短時間に多量に現れるアプリです。例えば画像の画素計算とか、数値処理などです。


521 名前:デフォルトの名無しさん mailto:sage [2012/07/20(金) 11:09:59.54 ]
>>520
1GBのテキストとなると、検索で大量の「ユニフィケーションの繰り返し」が
起こるからちょっと疑問。
Prologの向き不向きの話は、ソースプログラムのドキュメントとしての表現力では
確実に他のプログラミング言語の上を行くので、少々遅かったり、書き難い点が
あっても、向かないとは考えない方がよい。


522 名前:デフォルトの名無しさん mailto:sage [2012/07/20(金) 14:44:53.02 ]
>>519の内容は、単なるインデックス化テキストなんで、
(その上フレーズ検索が含まれてないという簡単仕様)
こういうのが向いてない汎用言語なんて基本的にないのではないか?
awkとかshだと面倒くさそうだけど。

523 名前:デフォルトの名無しさん mailto:sage [2012/07/20(金) 15:04:23.23 ]
>>522
Prologの場合は、toro.2ch.net/test/read.cgi/tech/1341099441/265 で書かれている
タグが述語ですから、タグの読み方、意味指定等、ルール付けに何の拘束もありません。プログラマの
自由であり、記述力も概ね無限です。
注釈、コメントを含めてのルール付けになりますから、単なる構造体による定義ではありません。

524 名前:デフォルトの名無しさん mailto:sage [2012/07/20(金) 15:16:37.29 ]
>>523
このスレでこの課題に応えるプログラムを公開すればよい。


525 名前:デフォルトの名無しさん mailto:sage [2012/07/22(日) 00:12:08.00 ]
タグが述語は余りよろしくないな。
複数タグを付けたり部分一致検索とかしずらい。



526 名前:デフォルトの名無しさん mailto:sage [2012/07/22(日) 01:29:55.61 ]
>>523>>522に対して何を主張してるのか分かる人いる?

527 名前:デフォルトの名無しさん mailto:sage [2012/07/28(土) 06:53:10.65 ]
>>526
猫タグ、動物タグに対して、暗喩を述語に持ってくるという話だろ。
タグとタグの関係を述語として述べるのは当たり前のことだと思うが。


528 名前:デフォルトの名無しさん mailto:sage [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 |
+--------------------

(続きあり)




529 名前:デフォルトの名無しさん mailto:sage [2012/07/28(土) 12:33:22.07 ]
>>528

ただし、person(1, yamada, tokyo).といった定義は不可とします。
なぜなら、この節定義では、1とyamadaとtokyoの「意味」がプログラムとして定義されていないからです。
1がpersonテーブルのidだと解釈できるのはプログラム外のコメント文やドキュメントを読んだプログラマだけです。
(C言語の構造体やJavaのクラスでは変数名として意味を定義できています。)

(おわり)

530 名前:デフォルトの名無しさん mailto:sage [2012/07/28(土) 13:59:37.01 ]
person(id(1), name(yamada), address(tokyo)).

531 名前:デフォルトの名無しさん mailto:sage [2012/07/28(土) 14:56:59.84 ]
>>530
>>482以降のレス参照

532 名前:デフォルトの名無しさん mailto:sage [2012/07/28(土) 21:24:10.18 ]
>>531
その議論に参加していたが、つまり何が言いたい?

533 名前:デフォルトの名無しさん mailto:sage [2012/07/29(日) 05:12:05.59 ]
>>530
本当に必要な情報は第何引数にnameがあるかというようなもの。

テーブル情報(person,1,id,integer).
テーブル情報(person,2,namae,atom).
テーブル情報(person,3,address,atom).

のような述語定義をする他ない。


534 名前:533 mailto:sage [2012/07/29(日) 05:44:40.80 ]
>>533
s/namae/name/

535 名前:デフォルトの名無しさん mailto:sage [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の制約はナンセンスだと思う



536 名前:デフォルトの名無しさん mailto:sage [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)

みたいに書ける。


537 名前:535 mailto:sage [2012/07/29(日) 15:56:55.27 ]
>>536
>person(address, Id, tokyo)
>
>みたいに書ける。

いや、以下のように「冗長」に書く必要がある

?- person(address, Id, tokyo), person(name, Id, Name).

それに対して常識的な>>535は「簡潔」に書ける

?- person(Id, Name, tokyo).

Prologにおいて、どちらが優れているかは一目瞭然だ

538 名前:デフォルトの名無しさん mailto:sage [2012/07/29(日) 16:30:28.00 ]
>>536

クエリー生成(_テーブル名,_引数リスト,_クエリー) :- 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を用意しなくては
ならない。そういう機構をうまく組み込まないと実用にならない。


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)を頻繁に行うのですが、
ショートカットキーなどはありますか?

541 名前:デフォルトの名無しさん mailto:sage [2012/08/17(金) 07:19:49.51 ]
一番高速にprolog動かせるのって
どの処理系なの?

542 名前:540 [2012/08/17(金) 07:20:19.68 ]
すいません、他の言語とごっちゃになってました。
質問を取り下げます。

543 名前:デフォルトの名無しさん mailto:sage [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(_重複を許すコーヒーの種類のリスト,_コーヒーの種類のリスト).

544 名前:デフォルトの名無しさん [2012/08/18(土) 07:42:46.14 ]
>>543
ありがとうございます!

545 名前:543 mailto:sage [2012/08/18(土) 08:07:26.97 ]
>>544
どの種類の「どの」にこだわった定義です。どのというからには、
候補リストが与えられるべきだ、という考え方です。
出題の様式というようなことを軽く見て、細部を表現する定義が
私好みです。



546 名前:デフォルトの名無しさん mailto:sage [2012/08/18(土) 11:42:04.21 ]
>>541
速度を追及するなら、自分でWAM実装するのが近道かと

547 名前:uY mailto:sage [2012/08/24(金) 08:23:55.57 ]
Prologを直で触る気はありません

>>>Rubyから<<< Prolog操作したいな〜と思い
https://github.com/preston/ruby-prolog

こんなgem見つけたんですけど使い方が不明です教えてくれませんか

548 名前:デフォルトの名無しさん mailto:sage [2012/08/24(金) 11:06:40.75 ]
examplesがあるじゃない。

549 名前:デフォルトの名無しさん mailto:sage [2012/08/27(月) 10:44:20.21 ]
>>547
多分、SWI-PrologのsyntaxからRubyのそれへの変換プログラムを
書かないと使い物にならないと思う。Prologを使いたいと思う課題の
述語はそんなに簡単には書けない。Prologの専門家に書いてもらって
それを使うか、専門の処理系で確かめてそれをRubyに移す方が確実。

550 名前:デフォルトの名無しさん mailto:sage [2012/08/27(月) 10:55:31.37 ]
そうかもしれない。Prologの専門家だってこれって問題では、
www.amazon.co.jp/dp/0201403757 なんかのお世話になって、
書き写し、書き写し、説明を解読しながら書くものだよ。


551 名前:デフォルトの名無しさん mailto:sage [2012/08/27(月) 11:50:25.32 ]
はあ?

552 名前:デフォルトの名無しさん mailto:sage [2012/08/27(月) 16:10:05.17 ]
>>550
そのリンクは第3版ですが、すでに第4版が出ています。

PROLOG Programming for Artificial Intelligence
www.amazon.co.jp/dp/0321417461

553 名前:デフォルトの名無しさん mailto:sage [2012/08/27(月) 18:11:20.68 ]
大学の演習でSchemeでProlog処理系を作らされたから、利用する機能を限定すればなればかなりのProlog処理系は自作できると思う

554 名前:デフォルトの名無しさん mailto:sage [2012/08/28(火) 19:24:32.09 ]
SchemeのPrologならminiKanrenは凄い短いソースで出てきてるね
Kanrenの方が使いやすいけど

555 名前:デフォルトの名無しさん mailto:sage [2012/08/31(金) 16:31:31.25 ]
沖電気のサイトにpython実装のprolog処理系の記事が掲載されてたよ



556 名前:デフォルトの名無しさん mailto:sage [2012/09/27(木) 11:46:27.80 ]
他のスレ(正規表現)での続きを書くと、
日本語で書かれてしかもPrologに触れているツイートのうち
評価を含んでいるものを調べると肯定、否定の割合は2:1くらい。
それとは別に、難しい、分からないとのツイートは多い。


557 名前:デフォルトの名無しさん mailto:sage [2012/09/27(木) 12:11:47.56 ]
Prologでする画像処理なんてありましたっけ?


558 名前:デフォルトの名無しさん mailto:sage [2012/09/27(木) 15:08:31.86 ]
>>557
Prologの欠点は遅いことです。それもC言語に比べて数百倍の単位で。
遅い理由は、バックトラックに備えてスタックを余分に積むことや、リストを
含む構造体のユニフィケーションの作業量の多さ、アトムテーブルの管理、
GCなどいろいろですが、これだけ遅いと対象範囲がビットマップ全体になる
計算はする気がなくなります。それで汎用システムとしての画像処理に適用
されたという話は聞いたことがありません。
Prologによる画像処理アルゴリズムの研究としては
www.amazon.co.jp/dp/0387196471 があります。

559 名前:デフォルトの名無しさん mailto:sage [2012/09/27(木) 15:42:42.51 ]
Wales大の人だな。MacPrologを改造したProlog+。
www.lpa.co.uk/はまだ活動しているみたいだな。

560 名前:デフォルトの名無しさん mailto:sage [2012/10/02(火) 10:11:30.88 ]
遅い欠点をもつPrologがAIのシステムに導入されたのはなぜ?
現在ではもう時代遅れになっている言語なのかな?

561 名前:デフォルトの名無しさん mailto:sage [2012/10/02(火) 11:39:10.46 ]
cutのあるバックトラックを使って、ほぼ宣言的に記述できるから。

562 名前:デフォルトの名無しさん mailto:sage [2012/10/02(火) 13:53:16.16 ]
>>560
C言語などとの相対速度の差は現在の方がさらに開いていると思いますが、
AIは極めて遅い人間の脳がモデルですから、元々速度はあまり問題ありません。
最後は例えばRubyでPythonで同じくらい簡単に書けますかどうですかということ
でしょう。
Prologについては、まだまだ2-3割しかその能力を引き出す努力がなされて
おらず、これからどうなって行くかまったく予断はできません。

563 名前:デフォルトの名無しさん mailto:sage [2012/10/02(火) 15:20:49.89 ]
なんか斜めです

> 元々速度はあまり問題ありません。
> RubyでPythonで同じくらい簡単に書けます

564 名前:デフォルトの名無しさん mailto:sage [2012/10/02(火) 15:23:18.10 ]
>>563
Prologでも書けませんが。

565 名前:Prolog工作員 mailto:sage [2012/10/02(火) 15:43:11.34 ]
>>563
今日、プログラマの水準は高く、Prologクラスの推論ならば、簡単に
インタプリタのロジックを各言語に組み込む方はいます。しかし、その
人が論理学にも精通していたとしても、Prologのプログラミング程度の
単純な論理であっても、いきなりある一定単位持続して書き並べていく
ことは多くの場合そんなに簡単なことではない。
だから、日常的に論理式の記述を習慣付けるためにPrologを使うのです。




566 名前:デフォルトの名無しさん mailto:sage [2012/10/02(火) 16:17:28.79 ]
Prologレベルの推論エンジンは簡単に書けるなら、
ASP solver competitionにでも参加してみてくれ。
まさかPrologベースのシステムに負けないよな?

567 名前:デフォルトの名無しさん mailto:sage [2012/10/02(火) 17:33:16.76 ]
1.まずPythonでPrologを実装します

568 名前:Prolog工作員 mailto:sage [2012/10/02(火) 17:43:02.82 ]
>>567
そういうアプローチが全てのプログラム言語で、できるだけ多くの
プログラマによって、なされることを期待します。
できれば表層はDEC-10 Prolog仕様(ISO標準も同じ)でね。


569 名前:デフォルトの名無しさん mailto:sage [2012/10/03(水) 01:00:34.38 ]
ISOに合わせるように頑張ってたけど
bagofが上手く実装できなくて詰んだはww

570 名前:デフォルトの名無しさん mailto:sage [2012/10/04(木) 16:06:23.95 ]
>>560
AIのモデルを簡潔に記述するのが目的だったから
それを何を勘違いしたのか、日本のICOTは秒あたりの推論数を競いだして自滅した

571 名前:デフォルトの名無しさん mailto:sage [2012/10/04(木) 17:11:04.53 ]
人間の脳は遅いです。ひとつのプロセッサーを見れば。ところが、1000個以上の
プロセッサが協調して働けば、何十万個のプロセッサ付き記憶装置から読み出せれば
偉大な働きをする。囲碁のような単純な思考でもそうでしょう。名人は1秒間に
何千万手に相当する手を読みますが、それは画像認識に近いレベルでなされる。
浮かんだ画像をこれは、だめ。これは、可能性があると。その一瞬10^3どころではない
オーダーの記憶装置付きのセルが働いている考えられる。
ICOTの目指した並行処理は間違ってはいなかったと思います。


572 名前:デフォルトの名無しさん mailto:sage [2012/10/05(金) 00:03:03.08 ]
飛行機は鳥のようにはばたかず、プロペラを回して飛ぶ。
自動車は馬のように駆けず、タイヤを回して走る。
AIは…?

573 名前:デフォルトの名無しさん mailto:sage [2012/10/05(金) 00:51:55.41 ]
>>572
emotionとかethics抜きで単体のintelligenceってのが
そもそも存在するのか?

ないものをマネようとして失敗してるんじゃないかと思う。
いや色々な知見は得られているんだけれども。


574 名前:デフォルトの名無しさん mailto:sage [2012/10/05(金) 05:50:08.90 ]
>>572
強い、弱いという分類がされますが、広義、狭義という分類も可能ですね。
馬の例えだと、馬の脚を車軸と車輪、タイヤで置き換えた。そこで止まって
しまったり、そこから発展して、鳥から飛行機->ジェット機のように別の物に
進化していってしまう。そういう展開全て包容してのAIというのもあり得る。
けれども少なくとも20年前のAIブームの頃には、こういうものはAI研究の
「お零れ」と認識していた。エキスパートシステムもそう。
一時的に馬の蹄がタイヤであっても、そこに止まっていては馬の神経系や
骨格の力学的な研究とも出会うことができないから、それは所詮工業技術
じゃないか。こちらの方が一般的な見解ではないか。


575 名前:デフォルトの名無しさん mailto:sage [2012/10/05(金) 12:20:07.04 ]
エキスパートシステムはロジックの部分がまさに本流なわけだけど…



576 名前:デフォルトの名無しさん mailto:sage [2012/10/05(金) 13:27:22.28 ]
>>575
上の文脈からいって、エキスパートシステムは適切ではありませんでしたね。


577 名前:デフォルトの名無しさん [2012/10/05(金) 14:09:15.30 ]
>>562
> AIは極めて遅い人間の脳がモデルですから、元々速度はあまり問題ありません。

いやでも、フレーム問題みたいなのも、
人間の脳の処理速度よりコンピュータの処理速度のほうがずっと高速だから
解決できるという見通しが当初からあったんでしょ?
つまり、コンピュータの高速な処理速度にAI実現の将来の希望を託していた
ことからすると、もともと処理速度は重要な問題だったわけで。

578 名前:デフォルトの名無しさん mailto:sage [2012/10/05(金) 16:09:56.25 ]
>>577
でも速度に「追っかけられる」というような業務ではないです。

579 名前:デフォルトの名無しさん mailto:sage [2012/10/05(金) 18:06:17.69 ]
天気予報に使ってるエキスパートシステムは速度が重要だよ。
予報が民間に許可された今はリアルタイム予報が期待されているから。

580 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 15:01:54.60 ]
確かにリアルタイムな天気予報は期待されてるけど、
具体的にはゲリラ豪雨みたいなイレギュラーな変化の予報。
これはエキスパートシステムのような大量の情報から引っこ抜くといった
性質のものでは無いのでは…。

581 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 15:36:21.25 ]
>>580
大気シミュの結果、各種リアルタイム測定値、過去の天候パターン記録などは、
エキスパートシステムのソースの一つなのよ。
扱う知識の一つというわけ。天候予測システムについても、
エキスパートシステム論についても知識が古過ぎ。

582 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 17:11:51.49 ]
いくら計算頑張っても元データの精度は超えないぞ。
縦横5km、高さ1kmのメッシュだからな。

せめてあと2ケタのデータ精度向上がないと、計算だけじゃ
ゲリラ豪雨の予測には届かないんじゃないか。

583 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 17:58:25.36 ]
GPV以外にも観測データはありまして…

584 名前:デフォルトの名無しさん mailto:sage [2012/10/18(木) 11:14:08.91 ]
Prologの宿題スレはなくなってしまったか。

585 名前:デフォルトの名無しさん [2012/10/19(金) 09:53:31.41 ]
>>584
大分書き込まれていなかったからね。400位以下にいただろうから仕方ないね。
結構おもしろいコードもあったし、他所からリンクも張ってあったから、
保存しておけばよかった。




586 名前:デフォルトの名無しさん mailto:sage [2012/10/19(金) 10:04:01.70 ]
>>585
代わりに「Prolog演習の課題を書き込みましょう」というスレを作ってみたが、
2日くらいでこれも削られた。聞くところによれば、今はテンプレの書かれていない
新スレは全部削られるらしい。スレたて荒らしの退治の余波で。

587 名前:Prolog工作員 mailto:sage [2012/10/19(金) 18:36:19.25 ]
最近のSWI-Prologでは、アトムや関数名の中に改行が含まれても
構わないようだ。'\n'で表現する必要がなく、自然に改行できる。
nojiriko.asia/prolog/j72_387.html
nojiriko.asia/prolog/c160_246.html
の最初の述語のような定義が可能である。これでシングルクォートも
省ければすばらしいのだが。


588 名前:デフォルトの名無しさん mailto:sage [2012/10/19(金) 23:53:01.60 ]
論文とか書く人ってどのProlog処理系使ってるのだろうか…

589 名前:デフォルトの名無しさん mailto:sage [2012/10/21(日) 17:48:15.67 ]
>>579
速度が必要になった時点でAIからは外れていると思います。
人間の能力を遙かにに超えたものを期待しているわけですから。


590 名前:デフォルトの名無しさん mailto:sage [2012/10/21(日) 21:04:53.19 ]
>>588
処理系の研究ならASP-Prologとかが多いんじゃないでしょうかねえ。
古典的なPrologとは違いますけど。


591 名前:デフォルトの名無しさん [2012/10/22(月) 08:29:19.82 ]
「Prologでまったり」から始まりこのスレに至るProlog系スレは、他の
スレに較べて、圧倒的にソースコード掲載の比率が高かった。
この希少な伝統を守るべく、どしどしソースを上げようではないか。

592 名前:デフォルトの名無しさん mailto:sage [2012/10/22(月) 08:59:03.59 ]
「憲法改正」は総選挙の争点になるか

安倍さんは「強い日本」「美しい日本」にしたいということで、まずは憲法9条の改正を目指す。
総裁選も盛り上がり、自民党が一気に国民の期待を集めている。
勢いに乗る安倍晋三総裁は、次期衆院選で憲法改正を争点のひとつにする意向を示している。

詳細 2012/10/21
www.zakzak.co.jp/society/politics/news/20121021/plt1210210709000-n1.htm




593 名前:デフォルトの名無しさん mailto:sage [2012/10/22(月) 09:00:20.64 ]
zakzakの記事貼るぐらいならまだイカリソースのほうがよかった。

594 名前:デフォルトの名無しさん mailto:sage [2012/10/22(月) 09:54:47.36 ]
>>592 % これを述語化しようと思ったが、結構難しく断念。 代わりに最近twitterに張ったものをここにも載せる。出典は空海の秘蔵宝鑰



暗生始 :- 生生生生.

冥生終 :- 死死死死.



暗生始(_) :- 生生生生(_).

冥生終(_) :- 死死死死(_).




595 名前:デフォルトの名無しさん mailto:sage [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).

浮き上がる泡がなくなったらバブルソート終了.



596 名前:595 書き直し mailto:sage [2012/10/22(月) 10:18:12.44 ]

バブルソート(L,L) :-
    浮き上がる泡がなくなったらバブルソート終了.

軽い泡はちょっと浮き上がる(L1,L3) :-
    append(L0,[_重い泡,_軽い泡|R],L1),
    _重い泡 @> _軽い泡,
    append(L0,[_軽い泡,_重い泡|R],L3).

泡が浮き上がったら最初からやり直す(L3,L2) :-
    バブルソート(L3,L2).

浮き上がる泡がなくなったらバブルソート終了.

597 名前:デフォルトの名無しさん mailto:sage [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,_最大公約数) :-
    割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数),!.
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_
除数,_剰余,_最大公約数) :-
    '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除
数,_剰余,_最大公約数).

割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数) :-
    _除数 = _最大公約数.

'割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除数,_剰余,
_最大公約数) :-
    ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を
除数として割ることを繰り返す(_除数,_剰余,_最大公約数).


598 名前:デフォルトの名無しさん [2012/10/23(火) 04:01:29.74 ]
昨日、「Prologの宿題片付けます」スレが第二編として復活しました。
toro.2ch.net/test/read.cgi/tech/1350893602/
出題-解答系はこちらに載せましょう。


599 名前:デフォルトの名無しさん mailto:sage [2012/10/23(火) 09:52:31.68 ]
そういえば、「いろんな言語で宿題 第5編」スレもDat落ちしてしまった。
勝手は事実上のPrologスレといえるほど、肩入れしていたのだが最近は
さっぱりで、二ヶ月近くも書き込みがなかったせいか削除された。
「いろんな言語で宿題」スレの歴史はム板の中でも秀逸だと思うが。

600 名前:デフォルトの名無しさん mailto:sage [2012/10/23(火) 10:40:52.30 ]
そのスレはJのコードの量だけでもちょっと見ることができないものだった。
JはAPL後継で有名だが、ほとんど知られていない数式処理関係のプログラム言語の
コードがかなり掲載されて凄いスレだったことは間違いない。私どもProlog勢が
書き込み過ぎて、Prologスレと見られてHaskell等関数型の書き込みが少なかった
のが残念だったけど。


601 名前:デフォルトの名無しさん mailto:sage [2012/10/23(火) 10:52:07.55 ]
いろんな言語で宿題 第五編
logstar.jp/toro.2ch.net/tech/1276873238/

602 名前:デフォルトの名無しさん mailto:sage [2012/10/23(火) 11:14:19.57 ]
マイナー言語がハッスルするスレですね。


603 名前:デフォルトの名無しさん mailto:sage [2012/10/23(火) 11:51:01.56 ]
>>602
「いろんな言語で宿題」スレは、大変マニアックなと言っては失礼に当たるかも知れ
ない専門家が一人いて、5題に1題くらいの割ではあったが、次々と書き込んで
くださった。私は結局覚えなかったし、ほとんど分からなかったが、十分楽しんだ。

604 名前:デフォルトの名無しさん mailto:sage [2012/10/24(水) 15:22:58.60 ]
>>603
J言語が大半だったと思うけど、あの手の言語の解答だけまとめたら、
結構話題になるサイトが作れるんじゃないかな。全部合わせれば
分量も多い。


605 名前:デフォルトの名無しさん mailto:sage [2012/10/24(水) 15:43:33.97 ]
間違いないことは、この3年間に、最もプログラムがリンクを張るのでなく
直接2chに書き込まれたプログラム言語はPrologだということ。それも
圧倒的に。それではなぜ書き込むことができたかが、重要な点なのだが。



606 名前:デフォルトの名無しさん [2012/11/04(日) 16:04:59.78 ]
三交代の当直表を作るときなんかは便利そうなのになぁ。縦横の
条件と初期条件を満たす解を探すのなんて数独と同じだよね。
それとクリティカルパスを考えるときに、データ構造を網構造として手続き型で
処理するか、ガッサリPrologエンジンに任せるか。まだメモリ8GB程度じゃ
遅いのかねぇ?



607 名前:デフォルトの名無しさん mailto:sage [2012/11/09(金) 21:14:46.06 ]
今でも結構人気なんですね。SchemeやGoよりGitHub利用が多い。
jp.techcrunch.com/archives/20120912javascript-tops-latest-programming-language-popularity-ranking-from-redmonk/

608 名前:デフォルトの名無しさん mailto:sage [2012/11/10(土) 11:41:57.60 ]
>>607
大体25位前後の人気のようです。アセンブラやシェルをプログラム言語と
見做すかどうかにもよりますが。米国では底固い実務的な人気があるようです。

609 名前:デフォルトの名無しさん mailto:sage [2012/11/10(土) 18:20:35.78 ]
モノ珍しいので一度は触ってみるという意味での人気であって、業務で使っているとは思えない

610 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 05:08:35.66 ]
>>609
日本の場合、大学に100以上の講座があって、それを受講したら
お終いなので物珍しいからに近い。あちらでは、日本でSQL枠と
されている就職口が論理という枠になっていて権威もある。論理
枠の中でPrologは一定の地位を占めていて、想像以上に実務でも
使われている。

611 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 05:34:52.19 ]
只々類似パターンの再帰の繰り返しのPrologがStackoverflowで質問数が
すくないことはよくわかる。ところが何故、まったくライブラリ指向でない
言語の代表のPrologがGitHubに結構upされているのだろうか。

612 名前:デフォルトの名無しさん mailto:sage [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つに見える

613 名前:デフォルトの名無しさん mailto:sage [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です…

614 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 15:36:43.35 ]
拡張子plはPerlじゃないし、GHCはHaskellのコンパイラじゃないのは世界の常識

615 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 16:12:53.88 ]
前者はともかく後者はもう日本国内ですら通じないだろ……



616 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 17:19:10.25 ]
ここ:-を,どこだと|思って,るんだ!.

617 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 18:07:12.48 ]
ソースに使われてる言語の判定にはこれ使ってるっぽいね
https://github.com/github/linguist

Perl製と判定されたソフトの8割が実はProlog製だった可能性が出てきたな……

618 名前:デフォルトの名無しさん mailto:sage [2012/11/14(水) 22:28:53.31 ]
あるあ・・・ねーよ

619 名前:デフォルトの名無しさん mailto:sage [2012/11/18(日) 03:03:49.27 ]
連番のエロ画像をダウンロードするスクリプトください

620 名前:デフォルトの名無しさん mailto:sage [2012/11/18(日) 19:47:08.62 ]
>>619
nojiriko.asia/prolog/ronri_prolog_619.html

621 名前:デフォルトの名無しさん mailto:sage [2012/11/23(金) 19:45:54.79 ]
>>619
エロかどうかの画像解析も必要?

622 名前:デフォルトの名無しさん mailto:sage [2012/11/24(土) 01:11:45.59 ]
必須

623 名前:デフォルトの名無しさん mailto:sage [2013/01/30(水) 14:34:59.52 ]
Prologの実装がいろいろあるけど
_ が任意にマッチするものと
_.1 _.2 みたいにマッチする部分集合をわけるものがあるみたいですね
それぞれの方式に名前がついてたりするのでしょうか

624 名前:デフォルトの名無しさん mailto:sage [2013/02/01(金) 08:26:29.05 ]
>>623
私は後のケースを知りません。確かめてみたいので
処理系をご存知でしたら、教えてください。

625 名前:デフォルトの名無しさん mailto:sage [2013/02/03(日) 16:44:21.38 ]
miniKanren
cKanren
という処理系です



626 名前:デフォルトの名無しさん mailto:sage [2013/02/03(日) 19:55:52.08 ]
_1 は知ってるけど _.1 は知らない

627 名前:デフォルトの名無しさん mailto:sage [2013/02/16(土) 23:41:31.81 ]
日常の諸問題の解決にPrologを使っている人はいる?

628 名前:デフォルトの名無しさん mailto:sage [2013/02/16(土) 23:57:59.44 ]
>>627
RDB使うかわりにレコードをprologのhead形式でファイルに追加して、prologの問い合わせで検索してる
SQLより使い勝手がいい

629 名前:デフォルトの名無しさん mailto:sage [2013/02/17(日) 00:01:25.81 ]
過疎スレでこんなに早くレスをもらえるとは思いませんでした。
head形式とはどういうものですか?

630 名前:デフォルトの名無しさん mailto:sage [2013/02/17(日) 00:22:14.39 ]
meisi(山田, xxx-xxxx, 東京都○○○○, 080-xxxx, 080-xxxx, ○○社, ○○課, 201301xx, 飲み会).
memo(201302xx, 隕石落ちた).
todo(201302xx, [郵便とりに行く, 印鑑確認する, 製本する, 連絡する, 掃除する, メールする/12]).

みたいなのをジャンル分けずにどんどん同じファイルにアペンド
今40000タプルくらいある

631 名前:デフォルトの名無しさん mailto:sage [2013/02/17(日) 00:32:15.91 ]
(・∀・)イイ!
実生活でPrologが役立っている例を始めて見ました

632 名前:デフォルトの名無しさん mailto:sage [2013/02/17(日) 10:27:12.81 BE:62807235-PLT(18001)]
私は社内IRCに
?- ... と打ち込むと謹製Prologが答えてくれるボット投入してます
誰も使ってないけど

633 名前:デフォルトの名無しさん mailto:sage [2013/02/17(日) 13:26:35.69 ]
昔Java版のprologが出たときに大学の演習で作ったルールベースシステムをアプレットに移植して人工知能の会話システムを作ったけど、大して身のあるシステムにはならなかった

634 名前:デフォルトの名無しさん mailto:sage [2013/02/17(日) 15:09:00.03 ]
Prologは初等教育に組み込むべきですね。プログラム言語としてではなく、
情報・知識の記述形式として。

635 名前:デフォルトの名無しさん mailto:sage [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))))).

のような書き方で、細部をいろいろ工夫しても、無駄なバックトラックが起こってうまくいきません。
どのように書けばよいのでしょうか。ご教示いただければ幸です。



636 名前:デフォルトの名無しさん mailto:sage [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.

のような形で実現しましたが、汎用的でないようですし、境界条件があとにきているのが気にいりません。

637 名前:デフォルトの名無しさん mailto:sage [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).

638 名前:デフォルトの名無しさん mailto:sage [2013/02/22(金) 18:57:40.84 ]
升目の数を数える問題ですか。問題をよく読んでいなかった。それだと
バックトラックするとダメなので、再帰で書き直す必要がありますね。
ずっと難しくなりますね。
それから、算数が嫌いなのでY2 is Y1 + 1,を複雑なリスト処理で書きましたが、
単純な算術でもちろん大丈夫です。

639 名前:デフォルトの名無しさん mailto:sage [2013/02/22(金) 19:16:47.42 ]
>>638
早速ありがとうございます。
バックトラックできないところと、カンマがANDを意味するため、
成功しないと後ろにいけないところなどがネックになっています。

640 名前:デフォルトの名無しさん mailto:sage [2013/02/22(金) 20:06:38.13 ]
>>634
今、ラッセルやウィトゲンシュタインみたいな分析哲学に凝っているんだけど、
知識の記述に述語論理を使うという前提を共有しているのに、
人工言語派vs.日常言語派みたいな分裂が続くあたり、
何ともいえない不思議さを感じる。

641 名前:デフォルトの名無しさん mailto:sage [2013/02/22(金) 20:35:52.78 ]
東アジアの農民は、10000年もゆったりした言語で特に深刻に悩むでもなく、
自然と共存したり、痛い目に遭わされながらつぶやいてきた。その延長の言語で
あってよいから、もう少しだけ自分が生きた証しをくっきりとできればいい。
言語に内在するほんの少しの論理性の助けを借りて。だから論理プログラミング。
その程度の論理プログラミング。

642 名前:デフォルトの名無しさん mailto:sage [2013/02/23(土) 16:24:36.29 ]
論理性の無い文章だなぁ

643 名前:デフォルトの名無しさん mailto:sage [2013/03/08(金) 23:47:28.33 ]
Prologでシークエント計算できますか?

644 名前:デフォルトの名無しさん mailto:sage [2013/03/09(土) 14:22:50.10 ]
できるけど、50行くらいプログラミングが必要

645 名前:デフォルトの名無しさん mailto:sage [2013/03/19(火) 05:22:51.00 ]
wa(you, shock).



646 名前:デフォルトの名無しさん mailto:sage [2013/03/20(水) 14:52:27.58 ]
prologのバックトラックを使って
深さ優先探索のミニマックス戦略のプログラムを作れますか。
やむをえなければassert,retractを使ってもかまいません。
幅優先探索ならできるのですが。

647 名前:デフォルトの名無しさん mailto:sage [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,_評価).

648 名前:647 mailto:sage [2013/03/20(水) 18:04:57.94 ]
そうか。
これだと、最善手をn手続けてみただけか。
一手目を非決定性に着手してn手先まで最善手で読ませて、すべての着手を
評価して、評価点がもっとも高い着手を選ぶようにしないといけないか。

649 名前:デフォルトの名無しさん mailto:sage [2013/03/20(水) 18:25:18.12 ]
>>647,648
深さ優先ですから、とりあえずある道筋で、最終局面まで行き、
そこで評価点を決め、それをひとつ下のレベルに下ろしておいて、
また別の最終局面に行って評価点を求め、其れを先ほどの値と比較し、
最終局面がなくなったら更に一つ下のレベルと比較......
のようなことを繰り返し、次第にレベルを下げていくことになるはずですが、
バックトラックをうまく制御できません。

650 名前:647 mailto:sage [2013/03/20(水) 18:45:14.17 ]
>>649
深さ優先といっても株は全部評価しないとどれが最高評価点かが
分かりません。それで最高点-最低点-最高点...と降りていって、
葉までたどり着いたら(つまりn手先)一つ候補が決まる。次善候補を
葉のレベルの次の評価点の候補着手とするという意味ですか?

651 名前:デフォルトの名無しさん mailto:sage [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........
というような感じだと思います。.

652 名前:デフォルトの名無しさん mailto:sage [2013/03/20(水) 21:31:55.30 ]
着手の選択/4と局面評価/2が未定義ですが、

nojiriko.asia/prolog/mini_max_senryaku.html

のようなコードでしょうか。

653 名前:デフォルトの名無しさん mailto:sage [2013/03/20(水) 23:01:45.80 ]
>>652
初心者ですので、他人のコードを読むのは難しいのですが、
これは基本的に幅優先のコードではないでしょうか。

654 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 00:23:36.01 ]
>>653
何か間違っていますね。 ! を削りましょう。そうすると、

着手候補の取り出し(_枝切り,_評価_着手_局面ならび_2,_評価,_着手,_局面2) :-
    length(L0,_枝切り),
    append(L0,_,_評価_着手_局面ならび_2),
    member([_評価,_着手,_局面2],L0).

の最後memberが働いて、全解を取り出せると思います。

3手先読みの最善手は -> 次の可能な全ての手を評価して整列 ->
探索範囲を狭めるため枝切り -> 最も評価の高い手を選択 ->
相手の立場から最も評価高い手を選択 ->
その局面で全ての可能な着手を評価し -> 整列して枝切り ->
これで第一解が得られる
バックトラックすると、
3手先読みの整列枝切り後も member/2 の次の候補が取り出されて第二解。

findmax で次々呼び出されて、最高評価点を探す。

655 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 00:55:51.96 ]
>>654
これ深さ優先でしょうか。
幅優先のような気がしてなりません。



656 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 01:29:24.35 ]
その人、悪い人じゃないんだけど、ちょっとおかしいところあるから、あまり関わらないほうがいいよ。

657 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 06:29:01.79 ]
>>655
Wikipedia の幅優先の項のグラフを借用して説明します。
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などは置いてきぼりの状態にあります。
これは幅優先ではありません。

658 名前:657 mailto:sage [2013/03/21(木) 06:31:38.99 ]
実際の手の読まれる順序 ですね。

659 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 10:44:06.29 ]
>>657
私の求めていたアルゴリズムとは違うようですが、
これはこれで興味深いですので、何とか解読してみたいと思います。
ありがとうございました。

660 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 21:35:47.92 ]
大学で習ったから家でもやろうかと思い立ったが、やっぱり個人で無料の場合はswi-prologなのだろうか
ちなみに大学は有料の処理系つかってたみたい

661 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 23:37:50.17 ]
教官とそのソフトの業者がつるんでるんだろうな。
でなきゃ、Prologとして十分な機能を備えているswi-prologを避ける理由が分からん。

662 名前:デフォルトの名無しさん mailto:sage [2013/03/22(金) 07:06:47.14 ]
>>661
ずっと以前のバージョンで日本語に不具合があったから、
というようなことが理由になっている場合が多いと思います。

663 名前:デフォルトの名無しさん [2013/04/02(火) 13:57:47.80 ]
macでgnu prologやってみたいのですが、「gprolog-1.4.3.tar.gz.」をダウンロードしてからが
分かりません、どなたか教えていただけませんか

664 名前:デフォルトの名無しさん mailto:sage [2013/04/02(火) 21:34:37.35 ]
GNU is Need Unix

665 名前:デフォルトの名無しさん mailto:sage [2013/04/03(水) 01:00:09.38 ]
>663
まさか解凍できないという話ではないでしょうね



666 名前:デフォルトの名無しさん mailto:sage [2013/04/03(水) 01:09:29.27 ]
xcodeとコマンドラインツールズとhomebrewもいれららない世の中じゃ、ポイズン。

667 名前:デフォルトの名無しさん mailto:sage [2013/04/03(水) 21:02:14.22 ]
ははあ、LC475かな。FPUというのがあってですね。

668 名前:デフォルトの名無しさん mailto:sage [2013/04/03(水) 22:00:36.89 ]
Macportもどうぞ

669 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 18:33:05.23 ]
【論理力テスト】次の文章は正しいようで実は論理的に間違っています。どこがどうおかしいか貴方は説明できますか→「何度学校を変わってもいじめられるのは、いじめられる側に原因がある証拠だ」…答えは「感情自己責任論」で検索

670 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 21:27:03.74 ]
>>669
検索したが分からなかった。
あなた説明して。

∀Student[∀School{bullied(Student,School)→caused(Student)}]
全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。

もしかして、反証可能な命題の提示ではあるが論理的な証明ではないとか言えば良い?

671 名前:670 mailto:sage [2013/05/18(土) 21:45:08.12 ]
違うか。

> ∀Student[∀School{bullied(Student,School)→caused(Student)}]
> 全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。

∀Student[∀School{(enroll(Student,School)∧bullied(Student,School))→caused(Student)}]
全ての生徒について、その生徒が在学したあらゆる学校で虐められるならばその生徒に原因がある。

672 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 13:06:01.33 ]
SWI-Prologって64bit版が出ていたのですね。
知らなかったが,Windows 7の64bit版に
今日インストールして使いはじめました。
気のせいか,処理速度がすこし速くなったよう
に思います。

673 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 20:15:05.45 ]
Bratko さんの Prolog 本(新版)の日本語版はでないのでしょうか
…原書の自炊ミスって単語一個分余計に切り落してしまい絶望中

674 名前:デフォルトの名無しさん mailto:sage [2013/05/20(月) 23:47:35.64 ]
SWI-Prologの64bit版をインストールしたのだけれど
SWI-Prolog-Editorと相性が悪いらしく,
configurationのProlog folderに64bit版のフォルダーを
していして,プログラムを書いてconsult.を押しても,
prologプログラムが見当たらないというエラーメッセージ
がでる。
しかたがないので,32bit版もインストールしてそちら
のホルダーを指定して使っている。
64bit版でSWI-Prolog-Editorを同期して使っている方
が居られましたら,どうすべきかご教授いただけると
ありがたいです。

675 名前:デフォルトの名無しさん mailto:sage [2013/06/14(金) 12:50:56.41 ]
prologで作られたアプリケーションやライブラリのリンク集みたいなものはないのでしょうか

prologで型推論エンジンつくろうと思ってるのですが
多分だれか既に作った人いないわけないので
どこかで公開していないかと



676 名前:デフォルトの名無しさん mailto:sage [2013/06/15(土) 00:25:36.27 ]
arXivで検索検索

677 名前:デフォルトの名無しさん mailto:sage [2013/06/17(月) 19:15:02.01 ]
>>675
rainyday.blog.so-net.ne.jp/2008-06-16

ここにPrologで書いたとても簡潔な型推論コードがある

678 名前:デフォルトの名無しさん mailto:sage [2013/07/05(金) NY:AN:NY.AN ]
量子コンピュータが実用化されたら Prolog 大活躍するん?

679 名前:デフォルトの名無しさん mailto:sage [2013/07/05(金) NY:AN:NY.AN ]
>>678
むしろPrologが必要なくなる方向を予想する

680 名前:デフォルトの名無しさん mailto:sage [2013/07/05(金) NY:AN:NY.AN ]
>>679
Prologの連言が量子コンピュータ上では通じなくなるなんて
ことがあるかなぁ。

681 名前:デフォルトの名無しさん mailto:sage [2013/07/05(金) NY:AN:NY.AN ]
>>680
というか、すべての計算を探索に還元するんだから、わざわざPrologで設計する必要がないというか

682 名前:デフォルトの名無しさん mailto:sage [2013/07/05(金) NY:AN:NY.AN ]
>>681
そういう意味での探索は実は現在のPrologにとって苦手。
遅かったり、スタックオーバーフローが起きたり。
ここの部分がアセンブラ化することはPrologにとって
御の字ではなかろうか。

683 名前:デフォルトの名無しさん mailto:sage [2013/07/05(金) NY:AN:NY.AN ]
量子コンピュータが実現しても、KL/1でやってることががprologのコードで書けるようになるというイメージしかない

684 名前:デフォルトの名無しさん mailto:sage [2013/07/05(金) NY:AN:NY.AN ]
Prologがやるべきことは、人間にとって寧ろ需要な
表層の知を確認する作業。要するにシンボル操作だから、
量子コンピュータとは直接的な繋がりはないかも。

685 名前:デフォルトの名無しさん mailto:sage [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].



686 名前:デフォルトの名無しさん mailto:sage [2013/09/01(日) 19:13:48.36 ]
swipl-win.exeで、日本語を入力したときにカーソル位置がズレるのですが、何か良い手はないでしょうか?
version 6.4.1 (windows 64bit)版です。

687 名前:デフォルトの名無しさん mailto:sage [2013/09/01(日) 20:41:43.53 ]
emacsのシェルモードで試してみてはどうか

688 名前:デフォルトの名無しさん mailto:sage [2013/09/01(日) 21:52:09.09 ]
windowsなので、emacsは入れたくないです。cygwinインストールが必須らしいので。
サクラエディタ上で使えたらよいのですが、うまくいきません。

689 名前:デフォルトの名無しさん mailto:sage [2013/09/01(日) 21:56:08.08 ]
>>688
emacsもmeadowもcygwin無しでOKのwindows版あるよ

690 名前:デフォルトの名無しさん mailto:sage [2013/09/01(日) 22:23:09.77 ]
ありがとうございます。試しにMeadow入れてみました。
M-x shellでシェルモードにして、その中でswipl.exeを実行してみましたが、
プロンプトが表示されないなど、満足に動作しませんでした。

691 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 16:18:13.90 ]
日本語対応が十分にできるている処理系はありますか?

692 名前:デフォルトの名無しさん mailto:sage [2013/09/12(木) 18:45:07.45 ]
Prologで仕様記述できますか?

693 名前:デフォルトの名無しさん mailto:sage [2013/09/12(木) 19:42:43.95 ]
>>692
ルールを決めればできるでしょう。

694 名前:デフォルトの名無しさん mailto:sage [2013/09/28(土) 12:48:49.81 ]
Prologで2つの値が等しいと(ポインター)アドレスが等しいは区別されていますか?
Lispのeq? equal?の違いみたいなものです

695 名前:デフォルトの名無しさん mailto:sage [2013/09/28(土) 16:58:44.30 ]
>>694

?- X = Y, X == Y.
X = Y.

?-
区別されませんね。



696 名前:デフォルトの名無しさん mailto:sage [2013/09/30(月) 16:49:29.65 ]
X =:= Y.

697 名前:デフォルトの名無しさん [2013/10/02(水) 13:46:42.08 ]
>>692
そこで言ってる仕様記述ってどういう意味のですか?

698 名前:デフォルトの名無しさん mailto:sage [2013/10/20(日) 04:46:24.01 ]
PrologにはstalinやMLtonみたいな
超高速コンパイラってありますか?

699 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2013/10/23(水) 11:23:06.63 ]
>>701
対象となっている、物、事、性質、動作、行為、状態、これらの複合したもの、
文章。何がきてもよいのではないですか。述語論理だから、述語、すなわち、
動詞句や形容詞等が来なくてはならないということはありません。

703 名前:デフォルトの名無しさん mailto:sage [2013/10/23(水) 19:36:57.16 ]
>>701
手続き的な例ですが、こんなのもあります。
nojiriko.asia/prolog/j72_815.html

704 名前:デフォルトの名無しさん mailto:sage [2013/10/24(木) 11:33:03.43 ]
>>702
PrologってJavaのメソッドのような意味での関数でなくMapやListのようにも
振る舞うみたいなので作法があるのかと思ってました
関連付けって思えばいいんですかね?

>>703
わかりやすいです
ありがとうございます

705 名前:デフォルトの名無しさん mailto:sage [2013/10/27(日) 06:57:07.73 ]
東京キャビネットみたいな
高速で検索できるデータベースの中を
Prologの命題で検索できないのでしょうか

MySQLは,それっぽいのみつけたので
既にあるのかもしれないですが



706 名前:デフォルトの名無しさん [2013/10/27(日) 09:25:23.92 ]
Prologで文法のサイトはよく見るんだが
VSのプロジェクトのような作り方ってPrologできるのん?

707 名前:デフォルトの名無しさん mailto:sage [2013/12/17(火) 10:57:32.78 ]
swi-prologが標準みたいだけど
swi-prologが一番使われてる理由って何故ですか?
swi-prologじゃなくて2番手みたいな処理系ってないのですか?

708 名前:デフォルトの名無しさん mailto:sage [2013/12/17(火) 11:59:17.93 ]
>>707
SWIは開発が活発で
組み込みやライブラリ、
ドキュメントが一番充実してる
教育や研究目的には向いてると思う

機能重視ならSWI
速度重視ならYAPやGNU Prologなどもオススメ

709 名前:デフォルトの名無しさん mailto:sage [2013/12/18(水) 12:46:39.18 ]
>>707
>>708に、日本語が十分満足に使えることを条件に加えると、
機能の SWI-Prolog 速度の AZ-Prolog でよいと思う。

710 名前:デフォルトの名無しさん mailto:sage [2013/12/19(木) 08:47:57.77 ]
PrologをSQLに変換するコンパイラなんてのをみつけた
Prologの構文って全部SQLに変換できるのだろうか

711 名前:デフォルトの名無しさん mailto:sage [2013/12/20(金) 17:55:44.14 ]
prologは演繹データベースだから、prolog -> SQL は難しい
SQL -> prolog なら大学の演習レベルでもなんとかなると思う

712 名前:デフォルトの名無しさん mailto:sage [2013/12/20(金) 18:58:22.89 ]
>>711
そうですね。単位節データベースの参照の後に延々とルールが来て、
それでデータベースのフィールド参照のキーが漸く来るなんてことも
有りえます。そういう場合は、selectを参照する条件としてそれらを
型推論的な先読みをしたとしても、拾ってくるのはかなり難しいです。

713 名前:デフォルトの名無しさん mailto:sage [2014/02/24(月) 00:48:00.61 ]
RDFのデータベースを検索するSQLの親戚あるけど
あれならPrologと一対一で変換できそう

714 名前:デフォルトの名無しさん mailto:sage [2014/03/09(日) 15:32:00.41 ]
SWI-Prologを使っているんだけどユニファイ可能な節が1つ以上存在するかを判定する組み込み述語ってある?

今はfindallした結果のリストの長さが0以上かで判定してる…

715 名前:デフォルトの名無しさん mailto:sage [2014/03/09(日) 16:10:50.90 ]
>>714
存在するか否かを判定するだけなら、単に質問すればいいのでは?
なぜわざわざfindallする必要があるのだろうか....



716 名前:デフォルトの名無しさん mailto:sage [2014/03/09(日) 18:25:03.73 ]
いい女ぴー?
やらしてくれるぴー?

717 名前:デフォルトの名無しさん mailto:sage [2014/03/16(日) 21:00:44.77 ID:8VpQ5LoV]
>>714
ユーザ定義述語であることが条件だが、findall/3とclause/2を使うのが普通だと思う。

ユニファイ可能な節が1つ以上存在するかを判定する(Head) :- findall(_,clause(Head,Body),[_|_]).

718 名前:デフォルトの名無しさん [2014/04/09(水) 21:24:27.23 ID:i/ZHdrIw]
>>717
findall/3を使わないと少なくとも幾つあるかはわからない。

719 名前:デフォルトの名無しさん mailto:sage [2014/06/05(木) 12:16:15.58 ID: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).

もっと面白い書き方ないかな?

720 名前:デフォルトの名無しさん mailto:sage [2014/06/05(木) 19:08:53.35 ID: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]).

721 名前:デフォルトの名無しさん mailto:sage [2014/06/05(木) 19:35:36.06 ID:h2Dia7Mk]
>>720
mainの最後に ! を入れて置かないと、バックトラックされるとCountが累計されていって、
いつかnth1/3が原因でスタックオーバーフローになるかも知れない。

722 名前:デフォルトの名無しさん mailto:sage [2014/06/05(木) 23:17:35.42 ID:awAmNJBx]
STAP細胞でコードゴルフでもするかね

723 名前:デフォルトの名無しさん mailto:sage [2014/06/06(金) 00:01:25.80 ID: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

ドヤ!

724 名前:デフォルトの名無しさん mailto:sage [2014/06/06(金) 00:03:45.32 ID: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
スペースつめるの忘れてた

725 名前:デフォルトの名無しさん mailto:sage [2014/06/06(金) 00:52:39.27 ID: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

もうだめだ寝る








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<222KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef