[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 05/09 17:56 / Filesize : 90 KB / Number-of Response : 272
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

Prologでまったり Part3



1 名前:デフォルトの名無しさん [2007/10/26(金) 08:26:46 ]
過去スレ
PrologでまったりPart 2
pc11.2ch.net/test/read.cgi/tech/1102664221/
Prolog でまったり
pc5.2ch.net/test/read.cgi/tech/976462999/
リンク集
www.summa.jp/lang/logic/prolog.htm
bach.istc.kobe-u.ac.jp/prolog/

チュートリアル
www.amzi.com/AdventureInProlog/
computing.unn.ac.uk/staff/cgpb4/prologbook/
www.intranet.csupomona.edu/~jrfisher/www/prolog_tutorial/pt_framer.html
bach.istc.kobe-u.ac.jp/prolog/intro/
www.geocities.jp/m_hiroi/prolog/
www.asahi-net.or.jp/~JF1T-YSD/prologV2/

81 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:54:44 ]
repeat して findall って、確かに嫌なコードかも。
私なら再帰で書きたい。

file2list(File, List) :- see(File), file2list(List), seen.
file2list(List) :- read(Token), (Token = end_of_file -> List = [];
List = [Token|Next], file2list(Next)).

とか。

82 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:29:13 ]
>>81
一般に業務システムのように大量ファイルを扱う場合、
再帰で書くとヒープ領域に解放できないアトムがたまり、
システムダウンの危険が発生する。それで、repeat failの
間で処理を済ませる。こうすることで、アトムを極力GCの
対象になるようにするのが定石です。しかし、この場合は
第二引数のListに貯めていくのだから、どちらのアルゴリズムを
採用してもリストから指されるアトムや複合項があるわけで、
あまり差がないと言えるのでしょうか。

83 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:31:29 ]
リストから指されるアトムや複合項 -> スタックから指されるアトムや複合項

の方がいいですね。

84 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 04:44:47 ]
>>16
5月に第3版の邦訳が出るということでしょうか?

85 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 05:02:22 ]
>>84
原書第4版のことでしょ
さらに延期されて2008年11月予定になってるけど
10年以上Prologの新刊が出てない我が国じゃ翻訳は期待できないね

86 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 07:47:26 ]
そうですね。アメリカの出版社っていうのはかなり前から
近刊を打つんでしょうかね。延期が多いですね。

87 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 13:22:35 ]
そうなんですか。
少しいじってみたらとても面白そうなので
あちこち眺めてるところでした。

88 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 13:24:24 ]
amazonで新刊を見ようと出版月日順にしたら
来年出版予定のがわんさか出てくるから困る

89 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 13:30:53 ]
>>87
>>16 と "The Art of Prolog Advanced Programming Technichques"
(邦訳名はPrologの技芸)の二冊はすべてのプログラム学習書の中でも
飛び抜けた存在だと思いますよ。



90 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 17:59:08 ]
プロログおもしろいよな
学校で学んでよかった
学校行ってなきゃLISPの方勉強してたかもしれない
せんせーあんがとー

91 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 18:00:37 ]
どっちもどっちだろ

92 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 18:25:44 ]
ゲーム的な感覚はプロログの方があるね。反駁と単一化というトリックに
乗せて解くパズルというか。

93 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 18:29:41 ]
生産性も3-4割は高いでしょ。黒川利明さんが言ってたんだから
結構信憑性がある。

94 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 18:34:01 ]
prologとocamlにはまってC忘れて就活の筆記で出された
C言語の問題を誤答しまくった俺が通りますよ

内定もらったけど最終面接で
「趣味もいいけどC,C++,Javaのどれかは常に使えるようにしとけ」と説教されたw

95 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:12:51 ]
JavaやってるとC#出来なくなる
C#やってるとJavaとC出来なくなる
JavaとCやってると開放しようとしたり忘れたりする
Prologやってると手続きがボロボロになる

96 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:13:09 ]
ということは、今4年?

97 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:30:43 ]
筆記にC出すなんて珍しい会社だな
ってか推薦使えよ・・・

98 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:35:18 ]
>>95
Prologの手続的解釈。ようするに心の持ち様。

99 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:54:32 ]
>>94
「PROLOGデータベース・システム」D・リー著 安部憲広訳 近代科学社

は読んだかい?



100 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:17:48 ]
ttp://www.ifcomputer.com/MINERVA/Manual/Reference/Predicates/logic_and_control/not_provable/home_jp.html
> もし、ゴールが失敗すれば、成功し、失敗すれば、成功する。
> もし、ゴール が失敗すれば、成功し、失敗すれば、成功することである。

難しいw

101 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:26:35 ]
Pは必ず失敗する、どう定義すればいいのかな。
P :- !,fail.
でよさそうに見えるが、誰かが上にこう付け加えた。
P.
P :- !,fail.
二行(節)目になった P :- !,fail. はPは必ず失敗するの意味を失うのだろうか。
注..Pの部分にはtrue,fail,!,以外の任意の項がくると考えてください。

102 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 11:06:04 ]
質問です。SWI-Prologで以下の質問をすると、
?- assertz(b(1)),b(X).
ERROR: Undefined procedure: b/1

これがISOの標準なのですか?

103 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 11:23:56 ]
次の場合とどうちがうのでしょうか。

?- assertz((a(X) :- assertz(b(1)),b(X))).

X = _G187

yes

?- a(X).

X = 1;

no

となります。

104 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 15:07:15 ]
>>102
ヒープエリアにb()という構造体が作られていないでしょうね。サブゴールは
ヒープエリアに構造体がないと実行できないに違いない。
ここでは、コントロールスタック上にだけ、b()の構造体が現れ、しかも、
その中の2つのb()がリンクされていない! そういう解釈になりますね。
ISO標準化かどうかは英文なので私には読めません。

105 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 15:11:41 ]
>>103
上の解釈が正しければ、assertzでヒープエリアにb()が作られるので、
今度は参照可になるのでしょう。ちなみにIF/Prologではどちらも参照可でした。

106 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 20:20:12 ]
>>104
コントロールスタック上にある構造体相互の参照はありませんね。


107 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 21:58:40 ]
>>102
dynamic b/1.
をすればokだと思う

108 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 22:02:29 ]
>>107
そういうのあるのですか。ありがとうございます。

109 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 07:16:32 ]
prologは宣言的な言語だと言われているのに、
挙動の説明にヒープやスタックといった個別の実装モデルが必要となるのが悲しい。




110 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 07:40:17 ]
>>109
それどころか、ISO標準のPrologの言語定義が
1) BNF的なもの 2)スタックモデルによる説明
の併記になっていることを知っているかい。
まあ、>>102 以下は実装レベルの話だから、確かに低レベル。

111 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 07:47:40 ]
他の言語で言えば、クロージャあたりに近い話だと思うけれど、
このassert(retract)問題は最初からPrologの弱点と見られていた
ように思う。

112 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 08:04:53 ]
>111
それはこっちの話だろ。
?- assertz(a(1)),a(T),assertz(a(2)).
T = 1;
no
?- a(X).
X = 1;
X = 2;
no
?-


113 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 08:41:34 ]
1980年代にはPrologでやればソフトウェアの生産性は少しはましになるん
じゃないかってそこら辺中でいわれていた。坂村健のようなひとでさえ、
シンポジウムのような席でもそんなことをいっていた。若き日のビルゲイツも
基本言語への採用を考慮し、最終的に見限ってVBの開発を指示したと
いわれている。
さて、それでは、どこがPrologがCOBOL等の代替言語になることを阻んだのか、
Windowsの基本言語になりえなったのか、理由をあげてほしい。
現在、Prologをやってるひとには自明なことばかりだと思うが、Prologを知らない
人にPrologを解体して見せるつもりで皆さんあげてください。

114 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:56:00 ]
Prolog自体は広まっていないが,
Prolog → 論理プログラミング → 制約論理プログラミング → 制約プログラミング
という過程で,利用されていると思う.

次は,Jリーグのスケジュールの例.
ttp://www.atmarkit.co.jp/news/200803/06/ilog.html
ILOGの制約プログラミングシステムが利用されているようだ.


115 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 18:08:59 ]
COBOLを代替できなったという点は、>>83にちょっと出てきているが、
アトムの爆発ということだとおもう。Prologではアトムをヒープエリア
内に一旦記述して処理する戦略をとる。極めて大きな記号間の連鎖を表現しよう
とする記号処理言語ではどこかに対象となる情報すなわちアトムを保持せざるを
えない。この場合、初出のアトムに対し必ずメモリ内を検索し、無い事を確認して
新たに構造体を追加する。業務処理で一日一億のトランザクションを処理する
ケースだとこの参照時間だけで相当のものだ。やはり破壊代入だけで済ませる
言語には太刀打ちできない。さらに再帰で処理した場合はオーバーフローの危険が
あるし、バックトラックして再束縛する場合でも、ヒープエリアのGCは必ず
必要になる。実際、保険業務などをPrologで処理することを想定すると、すぐに
電話帳一冊分くらいの量のアトムが発生してしまう。
企業業務はほとんどが記号処理、シンボル処理であり、Prologはそういう意味では
極めて適した言語なのだが、残念ながら以上のような理由から、大規模な業務処理
には向いていない。


116 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 08:21:39 ]
大規模な業務処理には向いていない。
しかし、小規模な業務処理には極めて向いているし、
未開拓の対象業務だらけという状態です。この点を
知らしめる必要はあります。
自分だけ儲けるためには静かに潜行するのが上策で
しょうが。

117 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 19:16:27 ]

BEST SOFTWARE WRITING
ある本に興味深い文があったので紹介。

Joel Spolsky (青木 靖 翻訳)
www.amazon.co.jp/dp/4798115819


(P 82)
> ところで、RDFを理解する秘訣はProlog言語のチュートリアルを読むことだ。そ
> のコンセプトはすっかり同じで、理解するのはそんなに難しくなく、そうして不
> 透明で不埒なRDFの仕様がはっきり分かるようになる。

118 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 19:17:25 ]
ありゃ、1行目と2行目が逆になってしまった。すみません。

119 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 19:42:39 ]
そういやこんなのあったね
www.swi-prolog.org/packages/semweb.html



120 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 06:43:07 ]
この頃ソースコード載りませんね。このスレこそソースを読みたいんだけどな。


121 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 09:56:22 ]
データベースと組み合わせて使ってもやっぱり大規模な業務処理は無理なんですか?


122 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 03:42:35 ]
>>121
create table をPrologで行うと、事情はまったく変わりませんね。
select * from を多用しても、全フィールドをアトムに変換しようとするでしょうから、
同じです。
select 商品 from 売上 ですと得られたtupplesの分のアトムが発生します。
Prologの直接のアトムの保管場所がデータベースに移るわけではないので、
本質的な差はないと考えます。
単一レベルの記憶であって、しかも巨大キャッシュメモリが存在し、データベースと
メモリーの境界を感じさせないシステムが当たり前になった時には、データベースを
Prologで置き換えることが可能になるでしょうから、大転回が起こると思いますが。

123 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 07:15:01 ]
データベースと共用しても、PL/IやCOBOLを代替できはしない。
しかし、Prologの最も幸せなプログラミングは連想三つ組の単位節を
Queryで極めて少量づつとりだし、それを組み立てて複雑な問題を
解く、というものだろう。データベースを前提にして、このような部分の
プログラミングが大規模システムの一角を担うことはもちろん可能で
システムの中で、論理系の部分だけ担うという現在のPrologの標準的な
立場とも合致する。現在のシステムにPrologが同居することになる。
それが可能なことなのか否かは、メインフレームのシステム管理に
知識がないから私には、これ以上何も言えないけれど、可能性は
以前から実はずーとあったのではないかと思っている。

124 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 07:39:27 ]
読みかえしてみたら意味不明のところがあったので補足します。
連想三つ組にはたいした意味はありません。強調したかったのは巨大な
データベースをQueryとして絞り込み、その情報の組み合わせで世界を把握する
というプログラミング態度です。巨像の表面の何か所かの要点を押さえて、
全体の意味を読み取ろうとする、そんな態度ですね。

125 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:22:36 ]
適材適所ですよ
今システムを構築している言語にエッセンスだけ吸収されれればこの先も生き残れる

126 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 16:04:25 ]
>>125
論理式で記述するということが要点だと思います。Prologのインタプリタや
コンパイラから参照することは必須ではない。JavaゃC++からでも一向に
構わないけれど、論理記述の形式としては、Prologほどのものはなかなか
ないのだから、このかたちで修練を積んでほしい。


127 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 19:23:10 ]
私はビジネスロジックをPrologで組んで、データの更新とかはRDBMSにまかせようと思っているのですが無謀ですかね?
アトムが爆発するというのはタプルをPrologのデータとして読み込んでしまうからで、それをやると破綻するのはどんな言語でも同じだと思っています。
カーソルを移動しつつ順番に処理していったり、必要に応じてSQLクエリを発行するという部分をPrologで書けないかと思っているのですが。

128 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 20:48:58 ]
>>127
>>115以降私が延々とやっているのは、汎用機で極限的な量のトランザクションを
処理している業務の代行ができるかとどうかという話です。これができないと、
大規模業務処理に向いているとはいえないからです。
一方、どのくらいまでの量のトランザクションならPrologで処理しても問題が起きないか
という視点もありえます。絶対安全な事例をあげておきます。私のところで19年間
Prolog+RDBMSで処理し続けているものです。
適用業務:石油卸+小売業の販売管理一部財務管理
一日のデータ数:平均 5300 レコード
RDBMSの最大テーブル(売上)のtupple数:max 800万
この程度だとプログラミングテクニックへの制限はまったくありません。
以前はガソリンスタンドのPOSからのデータ収集もPrologで行っていた
のですが、現在はこの部分は元売り業者が収集してくれます。
それをファイルで受け取り、sub_atomで分解しながら20のアトムに
分解してデータベースへinsertしていきます。
バッチ処理でこれに約20分かかります。あとは、Webによる参照、
インタプリタによるデータ入力、psファイルの作成、すべての帳票印刷、
これらはすべてPrologで書かれています。
:現在は売上以外のTableデータはProlog単位節として管理する
ことにしていますが、それでも一つのPrologインタプリタユニットの
平均メモリ使用量は20MBで40MBを越えることはありません。


129 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:12:13 ]
凄く初心者質問だと思うのですが
Prolog に方程式を解かせることって出来ますか?
ごく簡単な式で良いんです。例えば

2 + X = 5

とかそんな感じです。



130 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:12:22 ]
ピーク時7000レコード近くあったのが店を何店か閉めて減ってしまいました.
20分と書いてあるのはこのピーク時の平均でした。今朝測ったら11分。
ただし、これは皆様ご存知の事情によるものです。


131 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:34:58 ]
>>129
さすがにこの方程式解くプログラムなら私にも書けそう。
変数が二個以上入る連立方程式は、変数同士の関係についての
記述であると考えられます。
この変数同士の関係のことを制約といい、制約論理型言語と
いうものがその目的には相応しいとされます。つまり、今我々が
使っているPrologはこの制約を表現するのにやや欠けた仕様だ、
ということです。いくつかのPrologは自身をもう一層高水準に拡張
して制約論理型言語であると称しています。制約論理型言語の
なかにはPrologを土台としていないものもあります。詳しくはWikiか
何かで調べてください。

132 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:42:24 ]
>>129
2 + X を解析するには、
?- functor(2+5,Func,Args).
Func='+',
Args=2,
yes
?- arg(1,2+5,A).
A=2
yes
?- arg(2,2+5,A).
A=5
yes
つまり3引数の述語functor や 2引数の述語argを組み合わせてルールをかきます。
argで取り出した項が変数であるか、整数であるか、はたまたそれは式であるか、
を問いかけながらの解析ということになります。


133 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:44:55 ]
ごめんなさい。2 + X のはずが2行目から以後、2 + 5 になってしまいました。
5をX に置き換えて読んでください。

134 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 08:22:33 ]
>>129
方程式の解法(A + B = C) :- integer(A),integer(C),var(B),B is C-A.

ではだめかw


135 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 08:58:19 ]
そりゃ反則だw

136 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:01:41 ]
>>134
パターン全部書けばいいね。
でも、integerではなくnumberですね。

137 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:29:19 ]
方程式の解法(A + B = C) :- number(A),number(C),var(B),B is C-A.
方程式の解法(A + B = C) :- var(A),number(B),number(C),A is C-A.
方程式の解法(A * B = C) :- number(A),number(C),var(B),B is C/A.

延々と書いていく。
一般論になるけど、Prologプログラマにはこのように
パターンを数え上げれるだけ挙げて、それから、
ルールを書こうという人と、最初からルールだけで
済まさないといられない人がいるみたいだね。
外延的な表記が好きか、内包的なのが好きかって
いうことかな。


138 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 10:07:42 ]
理想主義的解放

en(X,_) :- var(X), !.
en(0,z) :- !.
en(N,s(X1)) :- number(N), N > 0, N1 is N - 1, en(N1,X1).

de(_,N) :- number(N), !.
de(z,0) :- !.
de(s(X),N) :- de(X,N1), N is N1 + 1.

add(X,z,X) :- !.
add(X,s(Y),s(Z)) :- add(X,Y,Z).

eq(X + Y,Z) :- en(X,X1), en(Y,Y1), en(Z,Z1), add(X1,Y1,Z1), de(X1,X), de(Y1,Y), de(Z1,Z).

enとdeが別定義なのがかっこ悪い。

139 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 10:36:17 ]
>>129
わざわざ「Prologで〜できますか」と書いているところを見ると、
Prologにそういう機能が内蔵されているか、という質問のように思えるね。
それはまあ、ありませんw
方程式を解くというのも、どちらかというと個別的な知識でしょう。

ただし、自分の知っている「式変形の規則」をだだっと書き出して、
それを堂々巡りしないように順序立てるだけで、案外そこそこ動くものができるかもね



140 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:47:41 ]
>>138
何かと思えば、、
自然数の加減算ならリストを経由してappendで解くという変態技もありそうだw

141 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:53:53 ]
方程式を素で解くなら Mathematica とか Maple とか使うことになるな。

142 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:54:29 ]
できたw
| ?- length(Two,2), length(Five,5), append(Two,X,Five), length(X,N).

Two = [_,_]
Five = [_,_,_,_,_]
X = [_,_,_]
N = 3 ->;
no

143 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:55:59 ]
頭いいなw

144 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 13:02:42 ]
a_plus_b_is_c(A, B, C) :-
length(ListA, A),
length(ListB, B),
length(ListC, C),
append(ListA, ListB, ListC).

?- a_plus_b_is_c(2, X, 7).
X = 5

うおおおお

145 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 13:08:33 ]
>>144
ざっと見て計算量がA×C以上になっちゃいそうだなw

146 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 13:11:57 ]
?- a_plus_b_is_c(20000, X, 1000000). とかやったら凍ったw

147 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 14:08:28 ]
いや、A×CじゃなくてA×B、A×(C−A)か。
あと、BのリストとCのリストの一部をユニファイする手間もあるけど。

148 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 20:36:43 ]
>>138
> enとdeが別定義なのがかっこ悪い。

じゃあこんな感じで上昇的に
pn(P,N) :- pn(P,0, N).
pn(z,N, N).
pn(s(P1),N0, N) :- (var(N) -> true ; N0<N), N1 is N0+1, pn(P1,N1, N).

149 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:12:31 ]
せっかく述語が分かれているから先に決めちゃうか
pn(P,N) :- nonvar(N), pn(P,0, N), !.
pn(P,N) :- pn(P,0, N).
pn(z,N, N).
pn(s(P1),N0, N) :- N1 is N0+1, pn(P1,N1, N).



150 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 10:44:31 ]
>>149
これは is 評価を使わないでpnだけで行こうとすると
ループに陥るのかな?

151 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:26:59 ]
無限ループに陥るのはNに自然数以外を与えたときで、
無限に成功するのは変数を与えたとき、のはずだけど、
is評価を使わずにというのは?

152 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:34:20 ]
 変数を

P、Nの両方に

153 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 15:26:12 ]
>>151
pn/2,pn/3で加減算できるなら、add1を使わずしてpnだけで
これをできないものかと。


154 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:36:00 ]
数値データと橋渡しをするには、どのみち整数の演算が必要なのでは?という話ではなくて?

155 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:34:40 ]
>>154
そういう意味になる。
is/2に双方向性がないので
この述語を削りpnで書き換えれば双方向性を
実現できるのかなと。

156 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:00:57 ]
>>155
演算の双方向性は>138の方式で実現可能。
encode/decodeの双方向性は十進文字列のparserを書けば可能かも。

157 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:22:34 ]
>>156
ああ、そうだね。私が言ってるのは
'2倍'(A,B) :-
の定義をAの2倍がBになると書いて、
それが、自ずと、Bの2分の1がAで
あるという述語定義になっている、
ということ。そのためには、最初の
定義一発にis/2を含むわけには
いかないだろう、というような意味ですね。

158 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:32:31 ]
pn/3で加減算っていうのはひょっとして、、
% P-Q = M-N
pn(P,Q, M,N) :- var(M), !, pn_aux(Q, P,N, M).
pn(P,Q, M,N) :- integer(M), integer(N), M >= N, !, pn_aux(Q, P,N, M), !.
pn_aux(Q, Q,M, M).
pn_aux(Q, s(P1),N0, M) :- N1 is N0+1, pn_aux(Q, P1,N1, M).
twice(A,B) :- pn(PA,z, A,0), pn(PB,PA, A,0), pn(PB,z, B,0), !.

| ?- twice(3,X).
X = 6 ->;
no
| ?- twice(X,4).
X = 2 ->;
no
| ?- twice(X,5).
error: stack is over.

絶対マチガッテルよこんなのw

159 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:54:21 ]
いやこうか
twice(A,B) :- pn(PA,z, A,0), pn(PA,z, B,A), !.

どうでもいいw



160 名前:デフォルトの名無しさん [2008/05/04(日) 18:39:02 ]
質問です。以下の表をprologで書きたいのですがわかりません。
お願いします。教えてください。
task| 内容     | 先行task | 期間 | 人数
-----------------------------------------------------------
a | 設計      | なし  | 1 | 2人
-----------------------------------------------------------
b | 材料rの調達  | a | 3 | 4人
-----------------------------------------------------------
c | 材料zの調達  | b | 1 | 2
-----------------------------------------------------------
d | 材料Wの加工  | b | 2 | 3
-----------------------------------------------------------
e | 部品Yの加工  | b | 2 | 3
-----------------------------------------------------------
f | Xの組み立て    | c,d | 2 | 2
-----------------------------------------------------------
g | Sの組み立て、検査 | e,f | 3 | 1


161 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:59:12 ]
>>160
設計指針として
1) -- と | はいらないから、削除したりカンマに置き換えます。
2)行の最後はピリオドが必要です。
3)テーブルの名前が必要です。命名します。これが述語名となります。
4)Prologの構文規則に沿うように修正します。2人 -> 2, Xの組み立て -> 'Xの組み立て'

task管理(a,設計,なし,1,2).
task管理(b,材料rの調達,a,3,4).
task管理(c,材料zの調達,b,1,2).
task管理(d,材料Wの加工,b,2,3).
task管理(e,部品Yの加工,b,2,3).
task管理(f,'Xの組み立て',c,d,2,2).
task管理(g,'Sの組み立て、検査',e,f,3,1).

見出し情報はふくみません。(task,内容,先行task,期間,人数)
これを例えば以下のように処理します。アプリケーションの中にこの情報を組み込みます。
task管理照会(_task,_内容,_先行task,_期間,_人数) :- task管理(_task,_内容,_先行task,_期間,_人数) .


162 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 20:14:30 ]
別に以下のように引数位置の意味を定義しておくこともあります。
task管理引数位置(1,task).
task管理引数位置(2,内容).
task管理引数位置(3,先行task).
task管理引数位置(4,期間).
task管理引数位置(5,人数).


163 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 20:29:24 ]
この定義があると、
?- 期間 が 2 の _定義節 は.
_定義節 = task管理(d,材料Wの加工,b,2,3);
_定義節 = task管理(f,'Xの組み立て',c,d,2,2)

などと答える可能性が生まれます。

164 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 20:42:42 ]
:- op(650,xfx,が).
:- op(640,xfx,の).
:- op(850,xf,は).
_項目名 が _値 の _定義節 は :- fonctor(_定義節,task管理,5),task管理引数位置(N,_項目名),arg(N,_定義節,_値),call(_定義節).

これで >>163 の参照が可能になります。

165 名前:160 [2008/05/04(日) 20:48:15 ]
もし人数がない場合を考える。

task| 内容     | 先行task | 期間 |
-----------------------------------------------------------
a | 設計      | なし  | 1 |
-----------------------------------------------------------
b | 材料rの調達  | a | 3 |
-----------------------------------------------------------
c | 材料zの調達  | b | 1 |
-----------------------------------------------------------
d | 材料Wの加工  | b | 2 |
-----------------------------------------------------------
e | 部品Yの加工  | b | 2 |
-----------------------------------------------------------
f | Xの組み立て    | c,d | 2 |
-----------------------------------------------------------
g | Sの組み立て、検査 | e,f | 3 |

次に続く。

166 名前:160 [2008/05/04(日) 20:52:13 ]
もし人数がない場合のプログラム。
scd(StartingTimes) :-
StartingTimes = [Sa,Sb,Sc,Sd,Se,Sf,Sg],
StartingTimes :: 0..20,
Ea #= Sa+1,
Eb #= Sb+3,
Ec #= Sc+1,
Ed #= Sd+2,
Ee #= Se+2,
Ef #= Sf+2,
Sb #>= Ea,
Sc #>= Ea,
Sd #>= Eb,
Se #>= Eb,
Sf #>= Ec, Sf #>= Ed,
Sg #>= Ee, Sg #>= Ef,
labeling(StartingTimes).
となって分かるのですが人数が入った瞬間分かりません。
この人数が入った場合の>>160のプログラムを教えてください。

167 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 20:58:45 ]
>>165 ちょっとその前に、
ごめんなさい。c,d と e,f をよみまちがえていた。
c,d e,f の意味があいまいだけれども、
'c,d' 'e,f' とするか、
[c,d] , [e,f] とするか、
はたまた、定義節を二つに分解することになる
task管理(f,'Xの組み立て',c,2,2).
task管理(f,'Xの組み立て',d,2,2).
task管理(g,'Sの組み立て、検査',e,3,1).
task管理(g,'Sの組み立て、検査',f,3,1).
この定義は意味が違うように思えるのですが。


168 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 12:46:40 ]
>>128貴重な情報ありがとうございます。
購買系のシステムに適用できないか検討中でしたので参考になりました。
Prologの処理系は何か商用のものを利用されているのでしょうか?


169 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 13:15:22 ]
>>168
私は20年間IF/Prologを使用してきましたが、5年前に国内では
販売を中止しました。シーメンスでは現在も販売していると思います。
日本CGIでも販売していたと思いますが、現在どうなっているか
知りません。
私はSWI-Prologへの移行準備中です。



170 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:34:29 ]
>>166

cumulative制約を使えば,人数制約できると思う.
使い方は人数制限が6名なら,単に
cumulative([Sa,Sb,Sc,Sd,Se,Sf,Sg],[1,3,1,2,2,2,3],[2,4,2,3,3,2,1],6)
を付け加えればOKのはず.

参考:
ttp://www.sics.se/sicstus/docs/latest3/html/sicstus.html/Combinatorial-Constraints.html#Combinatorial-Constraints

171 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 19:46:44 ]
>130-159
ありがとうございました。結局Prologで方程式を解くには
ある程度は書けるにしても、何かしらのロジックが必要になるのですね。

>141
なるほど。そんな言語もあるのですね。一応調べてはみます。

172 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:15:30 ]
>>171
Prologでは = に、=の左側の項と右側の項を単一化するという意味を
与えたので、方程式 2 + X = 5. を与えて、そのまま解けるということは
絶対にありません。
2 + X と 5を較べて、2 + 5は複合項 5は単項ですから、単一化のルールに
より偽となります。

173 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:27:45 ]
=:= や is だとどういうルールになりますか

174 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 20:21:48 ]
>>173
= については、意味を与えてしまったので、方程式と理解する余地を失ったと
言った方が適切かもしれません。
=:= は 左項 と 右項を共に関数評価した上で左項と右項を単一化します。
is は 左項 は 関数評価せず、右項だけ関数評価してから左項と単一化します。
変数は関数評価できないとされますから、
X =:= 3+4.
は左項を評価できずエラーとなります。一方、
X is 3+4 はX に 7が単一化されます。
整数や浮動小数点数は関数評価するとその値となります。
関数定義されていないアトムは関数評価されるとエラーとなります。
関数定義されているアトムとは、たとえば、timeのようなもので、
?- X is time.
X = 1210072210
と1990年からの積算時間が得られます。なほ、
?- time =:= time.
yes
となりそうですが、これは微妙ですね。左項の評価時の積算時間と右項の評価時の
積算時間が異なる可能性があります。


175 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 20:32:43 ]
ですから、方程式の解法を組み込み述語として、Prologが持つようにするとなると、
= =:= is などは使えず、2 + X = 5 の = 記号をオペレータとして使われていない
記号か、オペレータとして定義されていても多義性を持たせても構わない記号に
置き換える必要があります。

176 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:36:29 ]
かといって、述語にするにしても単純ではなさそうですね。
ユニフィケーションだけじゃ無理か。

177 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:51:12 ]
Prologでは方程式は解けないという流れになっていますが,
SWI-Prologや他の多くのPrologには,clp(R)やclp(fd)等の
制約論理プログラミングのパッケージが用意されているので,
それを使えば,方程式も解けますよ.


178 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 06:09:07 ]
そうか「Prologに解かせる」だから、Prolog言語と解釈する必要もなかったかもね

179 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 06:29:57 ]
底まで沈むことを楽しみにしていたのだが、agatteしまったね。あと68だったんだけど。



180 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 10:04:07 ]
ム板には「なぜ、 = が 代入 を 表す 記号 に なったか?」という
スレがありますが、Prologの場合も = が適切だったのかという疑問は
残ります。unify/2でなぜいけない? 論理変数を含む単一化は独特で、
これを = で示して、ひけらかしたい誘惑はあります。それと = は
やはり便利ですね。

181 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 07:37:43 ]
SQLのgroup by句付き集約参照に当たる組込述語の書式を募集します。
案をお持ちの方はどしどし出してください。






[ 続きを読む ] / [ 携帯版 ]

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

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