Prologでまったり Par ..
[2ch|▼Menu]
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)などでもできる。
項と論理式を表面上区別しないから。

482:デフォルトの名無しさん
09/08/06 02:28:41
例えば
findall(A,hoge(A),AList)
を論理的に考えてみると、
Findall(Hoge,x) ≡ ∀y[Hoge(y) ≡ Member(y,x)]
みたいな二階述語になると思う。(あってる?)

(=..)/2などで述語と引数をくっつけなくても、述語の引数にあたる変数を指定しさえすれば
高階の呼出しは表現できる、という例になっているんじゃないかな。
でもまあ言いたいことはわかるというか…。

483:デフォルトの名無しさん
09/08/06 02:38:39
> Findall(Hoge,x) ≡ ∀y[Hoge(y) ≡ Member(y,x)]

これはリストの順序とか全く無視していてかなりしょっぱかった。今は反省している。

484:デフォルトの名無しさん
09/08/06 04:43:20
>>480ー481
うんそうなんだけれど、特定の述語で高階化されているというのはまあ、
そう言う機能とかAPI欲しいよねってことで納得できる
中でごにょごにょしてるんだろうと。

=..が変?なのは、述語記号そのものを変数化できるということ
=..を使えば ∀X [X(Y, Z)] ってかけちゃうし

なんか言ってること微妙に間違ってる気もするがまぁいいやw

485:デフォルトの名無しさん
09/08/06 08:16:16
よくわからんけど、
述語論理の述語変数(や述語記号、関数記号)には個々に変数の数が決まっていて、
そもそもPrologの述語名(や関数子)とは対応していないから、
findall/3のやり方の方が、見た目は違っても述語変数を再現できている面がある。

とにかく(=..)/3がなくても一階論理を超えまくっている以上、鍵のように言うのは変だよ。
高階論理風の見た目とPrologの高階性は違う、というか。

486:デフォルトの名無しさん
09/08/06 08:18:02
(=..)/3じゃないや。。

487:デフォルトの名無しさん
09/08/07 00:14:05
?- alive(noriP).

no

488:デフォルトの名無しさん
09/08/07 12:25:11
そんな推測に過ぎない節を登録しないで欲しいな…

489:デフォルトの名無しさん
09/08/07 14:23:59
え?
登録されていない事実だから、否定してるのでは?

490:デフォルトの名無しさん
09/08/07 15:25:26
なるほど。

491:デフォルトの名無しさん
09/08/07 23:30:07
?- stayAt( noriP, Place ).

492:デフォルトの名無しさん
09/08/08 00:31:59
?-guilty(noriP).

493:デフォルトの名無しさん
09/08/10 13:32:34
>>486 が顔文字に見える

494:デフォルトの名無しさん
09/08/10 14:44:29
自信なさそうに、ちょっとうつむき気味に挙手してるようにも見えるなw

495:デフォルトの名無しさん
09/08/18 19:06:04
プロロげ!Prologer!
ちょっとまったりし過ぎじゃないか?

496:デフォルトの名無しさん
09/08/18 20:39:31
レスもprolonger。


497:デフォルトの名無しさん
09/08/19 10:43:28
じゃあ別スレで出てきた覆面算でも
ONE + NINE + TWENTY + FIFTY = EIGHTY

498:デフォルトの名無しさん
09/08/20 18:49:00
やってみたけど、多少枝刈りしても1分以内にはできなかった。
いや、普通の環境ならできるんだろうけどw

499:デフォルトの名無しさん
09/08/31 09:07:58
この数日、Haskellのスレで続いている副作用談義は勉強になる。
スレリンク(tech板)

500:デフォルトの名無しさん
09/09/01 07:29:44
発刊予定日さらに延期。2010/4/16。
URLリンク(www.amazon.co.jp)

501:デフォルトの名無しさん
09/09/01 20:35:51
prolonged...


502:デフォルトの名無しさん
09/09/01 21:55:24
誰がうまいこと言えと

503:デフォルトの名無しさん
09/09/02 10:12:24
Prologってコーディング標準とかないのですかね?
標準でなくてもいいのですが、よく使われている規約などあれば教えてほしいのであります。

504:デフォルトの名無しさん
09/09/02 10:30:42
>>503
ICOTではあったと思うけれど、資料はないだろうな。Prologはほんの一部ですが。
その後は、各企業毎に多少は決められてるだろうけど、ほとんど「ない」と
言い切っていいレベルだと思います。

505:デフォルトの名無しさん
09/09/02 13:14:33
>>504
そうですか…ありがとうございます。

506:デフォルトの名無しさん
09/09/02 13:30:04
私の場合は「散文的」でありたいと思ってるから、
そういう規則は設けないですね。

507:デフォルトの名無しさん
09/09/02 16:58:46
スレリンク(tech板:176番)
# [1]講座名:やさしいC言語
# [2]
# (1) 「ようこそC言語へ」という文字列を表示し改行するコード
# printf関数を使う。
# (2)「 ようこそC言語へ」と表示し改行してから「C言語をはじめましょう」
# と表示し改行するコード。ただしprintfは一回しか使ってはならない。

508:デフォルトの名無しさん
09/09/02 17:02:09
>>507
% Prolog
t507(1) :- write_formatted('%t\n',[ようこそC言語へ]).

t507(2) :- write_formatted('%t\n%t\n',[ようこそC言語へ,'C言語をはじめましょう']).

509:デフォルトの名無しさん
09/09/02 17:05:57
失礼、誤爆でした。>>507>>508は「いろいろな言語で宿題スレ」に
書き込まなくていけなかった。錯覚しました。

510:デフォルトの名無しさん
09/09/07 18:59:49
ところで
URLリンク(kansai2channeler.hp.infoseek.co.jp)
こういう課題をProlog流に解釈して解答をつけるとすると、
どんなことになるのかな? Cの解答例としては
URLリンク(kansai2channeler.hp.infoseek.co.jp)
がある。

511:デフォルトの名無しさん
09/09/08 01:52:15
世界の散文化はPrologでなされるのだろうか。

512:デフォルトの名無しさん
09/09/26 21:39:06
OS X 10.5.8にもSICS Prologってインストール可能だろうか?

513:デフォルトの名無しさん
09/09/27 10:07:56
本家サイトくらい読めよ。
URLリンク(www.sics.se)
URLリンク(www.sics.se)

514:デフォルトの名無しさん
09/09/27 10:28:45
なんですか偉そうに。かわりに読んでください。

515:デフォルトの名無しさん
09/09/27 12:59:50
どうしてそういう不安があるの

516:デフォルトの名無しさん
09/09/28 20:36:36
Mac OS X は、普通の Unix 系の OS だから、他の Unix 系の OS で動くアプリケーションなら、動くよ。
動かないのは、デバイスドライバとかの特殊なソフトウェアじゃないかな。

ただ、Mac OS X 用のアプリケーションは、他の OS じゃ動かないよ。
Mac OS X の独自機能だけを使ってアプリケーションを作るのが通例だろうから。

517:デフォルトの名無しさん
09/09/28 21:38:28
> Mac OS X は、普通の Unix 系の OS
machスレッドはpthreadとお約束が違うので
微妙に動かなくなったりするけどな


518:デフォルトの名無しさん
09/10/01 20:27:12
Prolog でやるエロゲー作ったら、みんな Prolog やるんじゃね?



俺は、エロゲーやらないけど

519:デフォルトの名無しさん
09/10/01 20:29:40
>>518
lisp ベースのゲームエンジンがあって、それを使ったゲームは
そこそこ売れているんだけど、みんなlisp やんないよね


520:デフォルトの名無しさん
09/10/01 20:39:50
>>519
それは、エンジンが lisp なんであって、lisp でやるわけじゃないんじゃ?
目に見えないと分からないでしょ。

521:デフォルトの名無しさん
09/10/01 20:42:59
Age of Empire の AI が Lisp ぽいという話はあったな

522:デフォルトの名無しさん
09/10/01 21:27:19
そういうチラ見せじゃなくて、
コマンドラインで Prolog 打ったら、
女の子が反応したり、
女の子に新しい何かを覚えさせたり
出来るのを考えてた

523:デフォルトの名無しさん
09/10/01 21:37:43
俺が喜ぶポーズを取ってみろ!

と指令を出すと、登録してある嗜好データベースで演繹して
そのシチュエーションでプレーヤーが一番喜ぶポーズを取る萌えキャラ。


524:デフォルトの名無しさん
09/10/02 03:51:46
subservient chickenみたいなものか

525:デフォルトの名無しさん
09/10/02 22:54:00
? like(you, me).
no.

〜 Fin


526:デフォルトの名無しさん
09/10/03 21:06:43
prologでSWAN SONG。
ピンポンピンポンピンポン!ってできたらいいなぁ。

527:デフォルトの名無しさん
09/10/04 23:16:07
SWI prolog はEmacsで使うとプロンプトが出ないんですが、
対処法はありますか?


528:デフォルトの名無しさん
09/10/04 23:22:37
Emacs22 + SWI-Prolog 5.7.15 on Linux で使ってるけどプロンプトでてるな。
環境は?昔、Windows上でつかってるときはなんか使い難かった記憶がある。
実用上問題はなかったのでそのまま使ってたけど。

529:デフォルトの名無しさん
09/10/05 02:46:19
>>528
Windows上でMeadow+SWI-Prolog(Version 5.6.62)です。
実用上は問題ないのですが、どうも気持ち悪かったものですから。



530:デフォルトの名無しさん
09/10/05 17:59:35
ファンクタに破壊的操作を加える述語ってありましたっけ?

531:デフォルトの名無しさん
09/10/06 18:26:46
関数子(ファンクター)をいじるというと…
例えばf(a,b)、f(123)などのfを一気にffにするとか?
述語名には影響はないんだろうか。(いや、複合項のことだろうとは思うけど)

532:デフォルトの名無しさん
09/10/07 05:36:52
問題.
久方のなかなる川のうかひ舟いかにちぎりてやみを待つらむ 藤原定家

この短歌に現れる枕詞「久方の」は
「なかなる川」= 京の中なる川 = 桂川 の
桂から月が連想されて、その月の光に対して、
添えられていると考えられる。

この関係を示す述語「久方のについて思い巡らし」を定義せよ。

533:デフォルトの名無しさん
09/10/07 07:03:07
プロログって

述語(主語や目的語や補語)

って形式だよね?
なんか自然言語の語順と一致しなくて気持ち悪いんだけど
その一因は、当時の計算機の処理能力(速度とリソース)にあると思うんだ。

いまのコンピュータ性能なら、自然言語の語順で同様のことができると思うのだけど
そういう言語でプロログに近い推論を行うものってある?

534:デフォルトの名無しさん
09/10/07 08:58:37
たぶんない。作ればあるだろうけど。

自然言語に近い語順、はいいけど、機械が扱うためにはきちんと形式化されてる
ことが必要だからね。

535:デフォルトの名無しさん
09/10/07 09:50:36
>>534

X:>自然言語に近い語順、はいいけど、
O:>自然言語に近い語順、は「どーでも」いいけど、


536:デフォルトの名無しさん
09/10/07 10:15:11
>>533
自然言語の語順と一致しなくて気持ちいい


537:デフォルトの名無しさん
09/10/07 10:51:45
気持ちがよければそれでいいのかと問いたい
問い詰めたい

538:デフォルトの名無しさん
09/10/07 10:56:43
自然言語にすり寄っても、論理学との関係がややこしくなったら本末転倒じゃないかな

539:デフォルトの名無しさん
09/10/07 11:15:46
英語的:  主語 <述語> 目的語 :- ... .
日本語的: 主語 目的語 <述語> :- ... .

この場合は述語指定に< >を使ってしまうので大小比較の時の記号表現にちょっと困る。
日本語的: (主語,目的語)述語 :- ... . とすれば現在と差なく処理できるが、
英語的: には適用できない。

540:デフォルトの名無しさん
09/10/07 11:41:56
relationなんで主語があるとは限らない。目的語も。

541:デフォルトの名無しさん
09/10/07 12:53:11
格概念への割り当てが面倒になって飽きること必至

542:デフォルトの名無しさん
09/10/07 16:03:17
>>533
計算機の処理能力というようなことではなく、考えに考え抜かれて、
現在の言語仕様が作られたように思うなぁ。

543:デフォルトの名無しさん
09/10/07 17:51:10
言語仕様はね。

構文は 述語(引数0, 引数1, ...) でなくたとえば (引数0, 引数1, ...)述語 も
ありだとはおもうけど、今の形になったのは計算機のリソースの問題とか
じゃなくて、数学の記法における慣習とか、そこらへんでないかと。

自然言語ライクな文法って、例えば Mind みたいな文法のことを
言いたいのかな?

544:デフォルトの名無しさん
09/10/08 03:35:50
述語が先にくる自然言語(タガログ語とか)を使えばよろしい。


545:デフォルトの名無しさん
09/10/09 12:34:55
op で上手く定義すれば、ある程度は自然言語に近付けられそうな気がする。

546:デフォルトの名無しさん
09/10/09 12:44:04
>>545
スレリンク(tech板:30番)
とか。

547:デフォルトの名無しさん
09/10/10 20:00:13
>>543
フレーゲあたりじゃない?述語論理の形式が整ったのって。
数学の関数 f(x) にヒントを得たんじゃなかろうか。

548:デフォルトの名無しさん
09/10/12 19:06:17
K-Prologについて教えてください。SWIに比べて制約があるようなのですが、
下記のコードはSyntaxErrorになります。
my-reverse([], []).
my-reverse([X | Xs], Ys) :-
my-reverse(Xs, Zs), append(Zs, [X], Ys).

SWI-Prologでは問題なく動くのですが。
K-Prologが本来の文法を維持しているのか?単なるバグなのか?
因みに下記だとK-Prologでも動きます。
my-reverse(R,L) :- my-reverse(R,L,[]).
my-reverse(R,[],R).
my-reverse(R,[A|L],LL):-
my-reverse(R,L,[A|LL]).


549:548
09/10/12 20:04:58
すみません、わかりました。K-Prologの意味不明なエラーに
悩まされていたのですが原因は単純でした。
コードの最後の行に改行がないと正しく読み取られないようです。
お騒がせしました。

550:デフォルトの名無しさん
09/10/13 09:05:17
最後に改行ないと本来はエラーなのかな?

551:デフォルトの名無しさん
09/10/13 17:36:30
>>550
SWIやYAPでは問題ないのでうっかりなのでしょう。

K-Prologはシンプルでなかなかいいです。
最近、多忙によりメンテされていないようですけど。

552:デフォルトの名無しさん
09/10/13 18:42:25
>>551
<終止符>は二文字で第一文字が"." 第二文字がasciiコード32以下の
文字ですから、K-prologの解釈が正しいと思います。


553:デフォルトの名無しさん
09/10/13 18:49:27
asciiコード32以下、という定義はちょっと面白いな。
0x1a(^Z)でもいいわけだ。

554:デフォルトの名無しさん
09/10/13 19:37:18
節と節の間に空白がなくて駄目だったという事態はわりとよくあると思うけど、
ファイルの終端という罠があったか。

555:デフォルトの名無しさん
09/10/13 20:53:06
32以下ってことは空白でもOKなのかな?

556:デフォルトの名無しさん
09/10/13 21:00:10
もちろんOKでしょ。最後に改行がなくても。

557:デフォルトの名無しさん
09/10/13 21:08:01
Prologの述語ってどの程度まで規格化されてるのでしょう?
M.Hiroiさんの順列生成のコード、K-Prologで動かないので調べてみたら
select述語の第1、第2引数の順番が逆に定義されていました。
perm([],[]).
perm(Xs, [Z | Zs]) :- select(Xs, Z, Ys), perm(Ys, Zs).

/* M.Hiroi
perm([],[]).
perm(Xs, [Z | Zs]) :- select(Z, Xs, Ys), perm(Ys, Zs).
*/


558:デフォルトの名無しさん
09/10/14 07:23:11
少ししらべたのでメモ。
select(X,L,<L引く[X]>)の形
・Quintus Prolog - library(lists)
・SICStus Prolog - library(lists)
・SWI-Prolog - library(lists)
・GNU Prolog
select(L,X,<L引く[X]>の形
・n-queensのプログラムにちらほら見られる(有名な本に載っている?)

559:デフォルトの名無しさん
09/10/14 07:32:57
ちなみに、SWI-Prologの古い版(3.1.2あたり)では後者のリスト先行の形もあったみたいだけど
あまりちゃんと見てない。
URLリンク(www.google.com)
lang:prolog ^select\(\[

560:デフォルトの名無しさん
09/10/14 07:54:53
Prolg-KABA では「ふろく」のプログラムの例としてQUEEN.PLが
載っていて、この中のselect/3は後者。

561:デフォルトの名無しさん
09/10/14 07:56:05
漏れのK-PrologからSWI-Prplog移植の経験(ほんの少し)だと、
[K] name(X, Y) が [SWI] string_to_atom(Y, X) てのがあた。

562:デフォルトの名無しさん
09/10/14 07:56:22
Prolog-KABAねw

563:デフォルトの名無しさん
09/10/14 08:06:15
Prologの場合、述語が双方向性を持つことが多いという特殊事情があり、
たとえば、member(A,L) はリストLにAが存在するかを問う場合この順序が
自然だが、Lから一要素づつ順に取り出す場合はPrologとして自然なのは
member(L,A) だろう。

564:デフォルトの名無しさん
09/10/14 08:06:29
Prolog-KABAか、懐かしいね。
自分はPC98買えなかったから、会社のHI-UX Prolog(超マイナー!)を触っていた。
その後、WinなPCを買ったけど、当時は日本語がまともに扱えて
個人購入できるのはK-Prologくらいだったから、重宝していたよ。

565:デフォルトの名無しさん
09/10/14 08:10:09
>>563
双方向性という特殊事情があるからこそ
どちらが自然であるかは一概には言えない、ってことだよね?

566:デフォルトの名無しさん
09/10/14 08:12:11
SWIにもname/2はあるみたいだけど、整数の扱いが違うとかそういうこと?
URLリンク(www.swi-prolog.org)
> (e.g. `name(N, "300"), 400 is N + 100' succeeds)

URLリンク(www.kprolog.com)
> アトミック項をその表記である文字列と相互変換します。
これだと数がどうなるのかわからないけど。

567:デフォルトの名無しさん
09/10/14 08:18:17
>>565
そうです。
もっともmember/2についていうと、append/3というスーパーセットがあり、
?- member(A,[1,2,3]). ?- foo(L),member(2,L). は

?- append(L1,[A|L2],[1,2,3]). ?- foo(L),append(L1,[2|L2],L).

と同じ意味になります。append/3くらいの地位を築いていると、
Aの位置が少々不自然でも文句を言う人はいないのかもしれない。

568:デフォルトの名無しさん
09/10/14 08:29:31
>>566
スマン、6年以上も昔の不正確な情報だったかもしれない。
当時作った(K-Prologの)プログラムに、以下のようなコードが残っていたから。

stringToPathList1([A|X], [B|Y]) :-
  !,
  name(B, A),
/* for SWI-Prolog
  string_to_atom(A, B),
*/
  stringToPathList1(X, Y).

569:デフォルトの名無しさん
09/10/14 08:31:26
ああ、昔のことだとわからないね

570:デフォルトの名無しさん
09/10/14 08:43:03
>>567
自分の場合、双方向性の必要の無い(入出力が明確な)リスト処理については、
関数型言語風のmap_list/select_list/if_listみたいなライブラリを作っているよ。
どれも function(入力リスト, 高階述語, 出力リスト) というスタイルで統一している。

571:570
09/10/14 08:54:06
>>570のif_listは間違いだ。reject_listに訂正。
if系は第2引数の高階述語向けとして定義していた。

あと、(appendに相当する)リストの結合処理は作っていないや。
もし作るとすれば、merge_list(入力リスト1, 入力リスト2, 述語, 出力リスト)
みたいな感じになると思う。

572:デフォルトの名無しさん
09/10/14 09:11:31
プロログで入力、出力とな!(麿のAA略

573:570
09/10/14 10:25:50
>>572
スマンw

ただ、並行論理型言語(KL1(GHC), Concurrent Prolog)の存在を知ってしまったから、
はたして逐次Prologにも双方向性(=非入出力)の概念が必須かどうかについて、
疑念を持ち始めていた。

もちろん、find_allといった全解探索に双方向性は必要。
でも、その後の得られた解の加工処理については、双方向性はかえって邪魔になる、
言い換えると、入出力を明確にした方がプログラムは読みやすくなると思う。

574:デフォルトの名無しさん
09/10/14 10:33:15
双方向性を狙って書く人は少ないと思うね。
図らずも双方向性が得られたという歓びで十分だな。

575:デフォルトの名無しさん
09/10/14 10:42:28
append/3 一つで済ませるをよしとするか、別述語とするかという話ですね。
Prologは基本的に単位節述語定義とappend/3だけで書くものだ、でいいと思うけど。

576:デフォルトの名無しさん
09/10/14 11:36:25
>>558
>>560
どうやら
select(L,<L引く[X]>,X)の形
もあるね。
% from Sterling and Shapiro, "The Art of Prolog," page 211.
と出典のあるやつ。

577:デフォルトの名無しさん
09/10/14 11:52:29
p右向き(X0,X) :- q(X0,X1), r(X1,X2), s(X2,X). % p右向き --> q, r, s.
p左向き(Y,Y0) :- s(Y1,Y0), r(Y2,Y1), q(Y,Y2).
あなたも順序を変えたくなーる

578:デフォルトの名無しさん
09/10/14 12:01:47
>>575
述語定義の中は全部appendで大いに結構だけど、ここではその一層上の
話じゃないか。ライブラリに登録する時の述語頭部の仕様のことではないか。

579:デフォルトの名無しさん
09/10/14 16:35:14
GoogleブックスでThe Art of Prolog(第2版)を見てみたら、
select/3は211ページ目ではなくもっと前の方に(要素先行の形で)載っていた。
ひょっとしたら1988年の初版とずれがあるとかいうオチかも。

580:557
09/10/14 21:37:52
みなさん、情報ありがとうございました。


581:デフォルトの名無しさん
09/10/16 16:25:27
スレリンク(tech板:486番)
の話ですが、こちらへ引っ越すことになりました。話の発端は
変数に情報をどこまで含ませられるか、コメントではだめなのか、でした。
A + B + C :- 売上入力検査(A,B,C,_診断), ... . と

_出荷日 + _商品番号 + _数量 :- 売上入力検査(_出荷日,_商品番号,_数量,_診断), ... .

の比較から、私が、
出荷日 A + 商品番号 B + 数量 C :- 売上入力検査(A,B,C,_診断), ... .

はPrologではできないので、としました。型出荷日のA、型商品番号のB、型数量のCが可能であるならば
_出荷日という蜻蛉のような表現よりは強いということです。
型について書いているのですが、私の視点は100%ソースコードの表現力に向けられていて、
コンパイラに於いて語られる諸問題とはほとんど無縁です。

582:デフォルトの名無しさん
09/10/16 17:31:16
# 自分も「美しい言語」スレから、こちらへ引っ越してきました。

>>581
最終的に実現したい事は、Prologで(「データ型機能」を実現したい!と言うよりも、)
「名前付きフィールド機能」を実現したい!という事ではないかと推測します。
たとえばRubyのメソッド定義であれば、

 def 売上入力検査(出荷日, 商品番号, 数量) .... end

と記述する代わりに、ハッシュを使って

 def 売上入力検査(*入力データ) .... end

と記述し、そのメソッド呼び出しを以下のように記述する事が可能です。

 売上入力検査( '出荷日 => 20091016, '商品番号 => 200, '数量 => 36.4 )

これに類似した述語記述を、(更には、もし可能であれば言語レベルでの型定義/宣言/検査も)
Prologで実現したい!ということではないかと考えました。
SQL言語であれば、既にレコードとして実現されている機能ですから、
(RDBと比較して)Prologデータベースが使いづらい点だと思われます。

このような認識で合っているでしょうか?

583:デフォルトの名無しさん
09/10/16 17:47:05
出荷日(A) + 商品番号(B) + 数量(C) :- 売上入力診断(A, B, C, _診断結果), …

だと順番が入れ替えられないのが問題なのかな?

584:デフォルトの名無しさん
09/10/16 17:56:51
>>583
いや、インタプリタのトップから、
?- 20091016+200+34.6.
# 売上入力検査 true 売上 assertz(売上('20091016','0200',34.6,'2009-10-16 17:55:00.000000')) 済み
yes
?- というように使いたい。そのためには 出荷日(A) ではダメです。

585:デフォルトの名無しさん
09/10/16 18:12:01
Prologを拡張して、
{A | 出荷日(A)} + {B | 商品番号(B)} + {C | 数量(C)} :-

のような表現を可能にすれば、?- 20091016+200+34.6.
は実現します。これは1980年代に中島秀之氏によって「項記述」という名で
Prolog拡張の提案として出されたことがあります。

586:デフォルトの名無しさん
09/10/16 18:26:19
>>582
私の意図したのはどちらかというと、>>585の型そのものですが、
この { _変数 | _型記述 } の_型記述部分にatomがくると無条件に
真となる、と定義すれば「名前付きフィールド機能」らしきものには
なります。しかし、フィールド名からどうやって呼び出すのかという
問題を解決せねばならず理論的なアプローチが必要でしょう。

587:582
09/10/16 18:27:58
>>584
>いや、

ということは、(>>582の)名前付きフィールドは不要であると考え、次の質問に移ります。

>いや、インタプリタのトップから、

インタプリタのトップレベルにこだわる理由は何かありますか?

たとえば、実行例を以下であるとし、

 ?- read_record.
 20091016+200+34.6. # <-- キーボードから入力
 yes
 ?-

とし、述語 read_record の中で 入力値検査と assert を実行した場合、
何が問題になりますか?

588:582
09/10/16 18:36:21
>>586
スイマセン、>>587をカキコする前にスレをリロードしてませんですた。
>>586へのレス内容は、今、考えています。

589:デフォルトの名無しさん
09/10/16 18:52:13
>>587
インタプリタのトップからに拘るのは、私がそれの虜になったから
ですね。元々一覧表のようなものが嫌いで、巨像をなでるような
細部の積み重ねで本当らしきものを築き上げることを好みます。
沢山、柔軟に質問できるものをよしとします。少なくともその方が
敏感でいられます。

590:デフォルトの名無しさん
09/10/16 19:33:55
グラフを述語で表現しようと思っています。
e(1,2). e(3,2).
のように点を数で表し、点の接続をe(X,Y)で表そうと思います。

ところで、グラフをプログラム中から変更したいのですが、
retract(e(1,X)).
とするとエラーになります。assertしたものはOKなのですが、
予めテキストに書いて読み込んだものはエラーとなります。
こういう場合、どうするのが定石なのでしょうか?

591:582
09/10/16 19:41:43
>>586

2点、要求仕様に関する質問があります。

まず、>>585の紹介してくれた中島氏の記述方式は、フィールドを前提としています。
たとえば、「変数 A の フィールド名は '出荷日' である」と宣言してます。
それに対して、>>586のレスでは、「名前付きフィールド機能らしきものになる」と
肯定しています。

その一方で、>>584のレスにある「いや」という表現から、「名前付きフィールド機能は
不要である」という意図のようにも読み取れるます。

これら二つの事柄は、自分の中では「矛盾」しているような気がしています。
ここから推測される意図として、以下を考えてみました。

・述語定義では名前付きフィールドを使いたい。
・ただし、問い合わせでは(フィールド名を省略した)タプルを使いたい。

この解釈で合っているでしょうか?

2点目の質問です。

# ここは>>587の後半にある質問内容と同一ですから、省略します。

ご返答を願います。

592:582
09/10/16 19:48:31
# またリロードせずにカキコやっちまったゼ....orz

>>589

要求仕様について、了解しました。

# ご返答を頂いたので、>>591にある2番目の質問は無視し、
# 先頭の質問に対するのレスだけでOKです。

593:デフォルトの名無しさん
09/10/16 20:25:38
GHCの処理系で今も現役のものってありますか?
また、and/or並列を自動的にやってくれるものってありますか?


594:デフォルトの名無しさん
09/10/16 20:59:01
>>591
一つ違うかなと思うのは、中島氏のものは後で確認しますが、私が考えているのは
出荷日(X) :-
integer(X),
今日(_今日文字列),
atom_to_term(_今日文字列,_今日整数),
X >= 20090101,
X =< _今日整数.
のような検査述語が定義されていて(20090932なども許す不完全なものだが)
{ A | 出荷日(A) } の出荷日(A)は単一化の付加機能として適用(call)される
ということです。ちょっとfindall/3の第二引数に似ています。
これで型出荷日(実は述語)と変数Aの関係が定義できます。
しかし、これは頭部による定義であり、副目標の引数にまったく同じ型の
変数は場合によると大量に発生しますから、それらの変数をD,E,F,G,H...と
置いていくと、その型についての情報はこの節の中にはないということに
なってしまいます。そのことから現在のPrologの枠組みでは型を取り入れ
それによってソースコードの情報価値を高めることはあまり期待できないと
いう結論になってしまいます。
名前付きフィールドも同様の理由から否定的にならざるをえません。


595:594
09/10/16 21:11:46
そもそもPrologとは論理変数のストリームを繋ぎ合わせる錬金術のことですから、
いちいち型など考えていられるか、ということになります。単純に言うと。
これは「もっとも美しいプログラミング言語は」スレで叫ぶべきことでしょうね。

596:デフォルトの名無しさん
09/10/16 21:17:00
>>592
と、突然正反対の結論になってしまいました。申し訳ない。
実はこの話、昔から何度も何度も持ち出してはうまく解決できず、
放棄を繰り返しているのです。

597:デフォルトの名無しさん
09/10/16 21:28:38
>>590
IF/Prologですか?

598:デフォルトの名無しさん
09/10/16 21:42:14
>>597
いいえ、K-PrologとSWI-Prologで試しました。


599:582
09/10/16 21:45:48
>>594
すいませんが、ここでレスをカキコするとスレの流れが発散しそうなので、
直接のレスは控えます。

何をしたいのか、そして実現方法としての中島氏の方式に関する質問へのレスを待ちます。
もし質問の意味に不明点や疑問があれば、質問を返してください。それには対応します。

# Prologで名前付きフィールドを実現する方法はいくつかあります。
# おそらく、中島氏の方式も、その一つであるように見えます。
# ただ、今の状況では、何も話せません。

600:デフォルトの名無しさん
09/10/16 22:08:35
>>590
>予めテキストに書いて読み込んだものはエラーとなります。

具体的には、どういう方法で読み込んだの?

>>593

GHCなんて超マイナーな言語を持ち出したってことは、
ICOTライブラリのサイトを見てるし、KL1という名前は知っているんだよね?
(まさかHaskellの処理系じゃないよね?w)

あと、後半の質問は知らない。

601:デフォルトの名無しさん
09/10/16 22:10:01
>>598 これでどうでしょうか。
ファイルの頭で :- dynamic(_述語形式リスト). を宣言します。

:- dynamic([e/2]).

e(1,2).
e(3,2).

602:デフォルトの名無しさん
09/10/16 22:46:23
>>601
うまくいきました。ありがとうございました。

今、ケイリーの木の公式の証明に使われているアルゴリズムを
Prologで書こうとしているところです。助かりました。

603:デフォルトの名無しさん
09/10/17 06:32:27
>>599
要求仕様に含まれる情報をできる限り遺漏なく、どうしたらソースコードに
盛り込めるか。これが私の課題で、型の採用は一案に留まります。
コメントでよいものか、関数名、述語名、論理変数に反映するべきなのか。
論理変数に反映したとして、どんな意味があるというのか。
それから、理論だけではなく、実務的にどれだけ有効であるか。それを測定できるか?
まったくの素人がPrologを一読して理解することがあり得るか?どうすれば可能か?
以上のような視点からの書き込みだったので一旦身を引きます。

項記述については、多分初出の第二回ロジックプログラミングコンファレンス(1984)の
Proceedingが手元にあるのでもう一度考え直して、近いうちに書き込みます。

604:デフォルトの名無しさん
09/10/17 07:39:57
このところの流れは単一化が邪魔してる部分の話か。
Prologの不人気の原因もそこに帰するような気もするね。



605:デフォルトの名無しさん
09/10/17 09:15:42
>>600
ガーン、GHCというか、ホーン節にガードを付けるって考え方はマイナーなんですか?
KLICも知ってますが、現役で開発・メンテされてる処理系ってないもんでしょうか。
Prologってもはや現実的プロジェクトでは使われることはないのかな。


606:デフォルトの名無しさん
09/10/17 09:30:09
マイナーというなら確かにマイナー。
GHCで表現しなくてはならないような課題を与えられた人はほとんどいない。
そういう意味でマイナー。美しさという点では一頭地を抜いてると思う。
Prologはプログラマも処理系も健在だから、いつでもプロジェクトを起こす
ことは可能だけど。

607:デフォルトの名無しさん
09/10/17 15:28:07
>>605

>>570だけど、逐次Prologそのもののがマイナーであることは、
このスレの寂れ具合で分かると思う。並列論理型に至っては....。

といっても、漏れは研究職でもなく、普通の職業プログラマでしかないから、
海外/国内の学会の動向を追いかけてるわけじゃない。
専門家に聞けば、また違った見解が得られると思う。

個人的には、過去に、業務でPrologでステートマシンのシミュレータを開発していたが、
そのエンジン部分をConcurrent Prologで書き換えたことがある。
処理系としてはbit誌に掲載されていたミニインタプリタに改造を加えたもの。
それ以降、活用の機会は無い。(逐次Prologは現役で、ツールとして活用しているが....。)

ただ、パイプライン構造のようにプロセスが一方向を向くシステムに限定すれば
逐次論理型言語で記述可能だけど、一般的なネットワーク構造を持つ場合には
(ストリームプログラミングによる)並列論理型言語による記述が適している。
だから、今は、システム全体を並列型で、個々のプロセス内部のアトミックな発火を
(関数としての)逐次型で記述するという、ビジネス向けシステム仕様記述技法に
応用できないかと考えている。JSD法(ジャクソンシステム開発法)に近い発想。
処理系としては、前記のミニインタプリタを復活させる予定。

608:デフォルトの名無しさん
09/10/17 17:49:20
Oz言語(処理系Mozart)は、どうなんだろ。
それを中心に使ってる有名な分厚い本(ゴメン題名忘れた)で、GHCとかの並列論理型言語の概念も紹介されてて、その欠点も指摘してたんだけど、
それだったら、Ozは、その欠点を克服出来るようになってないのかな。

609:デフォルトの名無しさん
09/10/17 18:23:09
Ozはマルチパラダイム言語であることくらいしか分かっていないけど、
問題解決の有効な一手法だと思う。その本は読んでいないけど、
おそらく並列論理型言語の問題は処理効率ではないかと想像。

ただ、論理型言語の魅力は、(処理効率を引き換えに得た)柔軟性と拡張性にあると考える。
だって、論理型言語の枠組みの中で、関係データベース、構文解析、関数、並行性、
制約解消、そしてオブジェクト指向を、次々と実現してきたんだから。
だから、プロトタイプやモデルシミュレーションといった、
処理効率の問題を無視できる用途であれば、
論理型言語(Prolog)は、まだまだ成長/発展を見込めるハズであると思う。

逆にマルチパラダイム言語は、魑魅魍魎というか混沌とした世界のように見える。
もちろんOzは触った事がないから、無知故の偏見だと思うが....。

610:デフォルトの名無しさん
09/10/17 19:06:00
>>582
先程から売上入力検査の部分を再考していたのですが、ドキュメントとして
ここは必要という部分だけ、型(らしきもの)を添えるというのは
やはり有効かもしれませんね。

  消費税計算(商品番号 => 200,数量 => 36.4,消費税率 => 5 %,売上金額 => A,消費税 => B),
  売上金額検査(A,売上金額 => C),

というようなコードだとしても、情報量は明らかに豊かになります。
消費税計算の中で金額を計算するとしている部分は不自然ですが。

611:デフォルトの名無しさん
09/10/17 20:51:21
>>610
Prologへの名前付きフィールド機能拡張の試みはいくつかありますが、
その一つに「レコード・プログラミング」という概念があります。
レコードとは、C言語の構造体やSQLのCERATE TABLE文のような、
<フィールド, 値>のペア(対:つい)から構成される集合を意味します。

たとえば、

 消費税計算(200, 36.4, 5, A, B)

というPrologの述語記法は、以下のようなレコード記法で書き換える事ができます。

 [関係→消費税計算, 商品番号→200, 数量→36.4, 消費税率→5, 売上金額→A, 消費税→B]

さらに、消費税計算 を型とすれば、以下のように表現できます。

 [商品番号→200, 数量→36.4, 消費税率→5, 売上金額→A, 消費税→B]:消費税計算

'消費税計算' とは、「型(らしきもの)」なんかじゃなくて、レコード・プログラミングの世界では、
まさしく「型」なんです。型の導入によって、「個別消費税計算 is_a 消費税計算」や
「総合消費税計算 is_a 消費税計算」のような型階層(継承)の導入が容易になります。
おそらくデータ型機能(型定義/型宣言/型検査)の導入も可能になるでしょう。

そして、レコード・プログラミング自体は考え方(パラダイム)ですが、もしもその考え方を
Prolog言語へ直接的に導入したとすれば、それはまさに、>>610のような記法になるのだと思います。

なお、このカキコのネタは、以下の書籍にある「レコード・プログラミング」の章です。
・続新しいプログラミング・パラダイム, 横田一正他著, 共立出版, 1990年


612:デフォルトの名無しさん
09/10/19 12:36:04
>>609
いや、指摘されてた問題点は、処理効率ではなくて、言語のモデルの方だった。
それに論理型の問題点じゃなくて、あくまで並列論理型の問題点だよ。
何かの問題では、モデルが悪くて上手く適用出来ないけど、
その原因は、並列論理型だと、並列性だったか、ストリームだったかが、自然に融合し過ぎていて操作対象として扱えないからという事だったようにと思う。

うっかりしてたけど、GHC〜KL1をやってた上田教授(?)が、それをさらに発展(?)させた言語 LMNtal をやってたよ。
日本語以外も検索する指定で google で検索すると、pukiwiki で構築されてて、英語だけで、分子っぽい図があるページが見つかると思うけど、そこが LMNtal の本拠地みたいだ。
携帯からなんで URL が書けなくてゴメン。


613:デフォルトの名無しさん
09/10/19 17:37:01
>>612
>並列論理型だと、並列性だったか、ストリームだったかが、自然に融合し過ぎていて操作対象として扱えない

たしかに、GHCはストリームを明示的に記述するから、それ自身は操作対象としては扱えませんね。
ただ、それ以上は(>>608の)Oz本を入手して読まない事には何とも....。

>GHC〜KL1をやってた上田教授(?)が、それをさらに発展(?)させた言語 LMNtal をやってたよ。

LMNtalは初見でしたので、でググってみました。斜め読みですが、初対面の印象は以下の2点。

・GHCでは、プロセス間通信チャネルとして差分リストを明示的に記述する必要があったけど、
 LMNtalでは、それが隠蔽されている。

・「形式的な視覚化(visual formalizm)」が可能な計算モデルである。例題のappendは面白い。

最近は並列論理型言語の動向を追いかけていなかったのですが、研究レベルでは着実に進展している
みたいですね。並列論理型言語の誕生から未来への展望については、上田教授のサイトにあった、
以下の解説が読みやすかったです。Ozも(LMNtalとは別の方向性?で)GHCの流れをくむことが見えます。

・上田和紀,論理・制約プログラミングと並行計算.コンピュータソフトウェア,Vol.25, No.3 (2008)

614:デフォルトの名無しさん
09/10/19 21:07:10
>>613
> たしかに、GHCはストリームを明示的に記述するから、
> それ自身は操作対象としては扱えませんね。

KL1はメタレベルアーキテクチャ持ってたよ。
OS(PIMOS)はそれで書いてた。
荘園。

615:デフォルトの名無しさん
09/10/20 13:08:02
Prologをほめたたえているサイトとかありませんか/

616:デフォルトの名無しさん
09/10/22 12:13:47
そんな過去の事より、Prologの未来の話をしましょうよ/
それと、最後のスラッシュは、なに?/

617:デフォルトの名無しさん
09/10/22 12:29:37
シフトキー入れ忘れて?が/になっちゃったんだろう

618:デフォルトの名無しさん
09/10/24 12:14:36
>>612 >>613 >>614 >>616
AZ-Prologの新バージョンには並列処理が入ったよ。
OR並列でガンガンいけるらしい。


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

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