[表示 : 全て 最新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/

72 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 07:55:53 ]
P# 日本語通るようにならないかなぁ。

73 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 11:56:57 ]
>>72
Prolog Cafeを試してみたら?

74 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 20:16:23 ]
>>73 ありがとう。
私はmonoでOSはKbuntuをutf-8のところをEUCに使っている。これだと、
何がおきても仕方がないのだけれど、PrologCafeを起動した場合、
ほぼ日本語は満足がいくレベル。それが# mono PsharpIntrp.exe
で起動されるPrologCafeではまったくダメ。
ひとつは、Windowsだとどうなのだろうということ。(私の家にはWindowsがない)
もうひとつは、Psharp.dllを変更できないかということ。


75 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 12:47:21 ]
>>74
WindowsXPだと日本語使えなかったよ。

76 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 09:40:33 ]
ちょっと質問なんですが、
file2list(File,List) :- see(File),findall(X,(repeat,read(X),(X=end_of_file,!,fail;true)),List),seen.

は、随分と胡乱臭いコードなのですが、皆さんはどんな方法でさばいていますか?


77 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 11:35:35 ]
> 胡乱臭い

妙な言い回しだな

78 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:36:17 ]
胡乱な、かw

79 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:45:32 ]
胡散臭い

80 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 19:20:25 ]
胡乱臭い・・・これは面白い表現かもしれぬ!



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句付き集約参照に当たる組込述語の書式を募集します。
案をお持ちの方はどしどし出してください。

182 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 08:00:43 ]
>>115
アトムテーブルの参照はハッシュが使えたとしても、
相当の負荷が掛かるのだろうか。最終的には必ずアトム文字列の
strcmpが起こるとすると、アトム長が256バイトとか大きくなると
それだけで馬鹿になりませんね。


183 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 07:43:27 ]
1億回で1秒くらいかねw

184 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 23:08:44 ]
codepadにはPrologないなと思ったのでshelogが使えるか試したら動いたので報告。

>974 名前:デフォルトの名無しさん 投稿日:2008/05/19(月) 23:00:17
>schelogを使ってみた。
>Prologと考えるとトリッキーな文法だけど一応動いた。
>ただ、すぐにメモリーのリークでコケル。
>ttp://codepad.org/cgNOmn0r


>975 名前:デフォルトの名無しさん 投稿日:2008/05/19(月) 23:02:04
>>974
>例題はBratkoから拝借。

185 名前:デフォルトの名無しさん [2008/05/21(水) 12:27:17 ]
InterlogをUNIX系OSにも移植してくれないかな?

186 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 12:54:20 ]
>>185
同感。

187 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 18:16:09 ]
interlogなんてHPもなくなってるジャマイカw

188 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 04:23:19 ]
Prologみたく演算子を追加できる言語ってyaccのような
パーザジェネレータで扱える?
扱えないとしたら、CやJavaでProlog処理系を書くとき、
パーザは自前で書くのが普通?
検索してもProlog(DCG)「で」構文解析する情報ばかりで、
Prolog「を」解析する情報が見つけられないもので…

189 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 17:26:35 ]
yacc 使うんなら演算子っぽいものを優先順位なしでパースして、
後から構文木を変更していくという手法がある

190 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 18:38:14 ]
>>188
Java VM などと Warren AM の違いを質問しているのかな?



191 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 18:42:00 ]
>>190
エスパーですか

192 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:04:19 ]
Prolog compiler の実装は、WAMが公開されたのでそれが主流になっている。
WAMでググってPDFファイルを熟読汁!

193 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:27:46 ]
Prologを効率よく実行するためには、こういうアーキテクチャのコンピュータがあればよい、という、モデルとして、「Warrenの抽象機械(Warren's Abstrusion Machine)」というものがあります。
WAMはDavid Warrenという人が考案したものです。WAMは、そもそも、WarrenがPrologのコンパイリングの研究のために考えたものです。
そして、WAMは Prolog実行の本質をついていたので、WAM以降、 Prologマシンのアーキテクチャは強くWAMの影響を受けました。
WAM はレジスタベースの汎用マシンアーキテクチャを意識して, DEC-10 Prolog(当時主流だった Prolog 処理系)より洗練された機械語命令セットを持つコンパイル技術を提案しました。
今ではこの命令セットを持つ仮想マシンを WAM(Warren Abstract Machine) と呼びます。ちなみに標準のJavaバーチャルマシーンはスタックベースです。
WAM は,バックトラックが少なく,複雑なユニフィケーションも少ないという設計思想を前提に高速化を実現しようとしました。

David WarrenはSB-Prologの作者の一人です。SB-PrologはStony BrookにあるSUNYのDavid WarrenとSuzanne Dietrichによって作られ、メンテナンスがアリゾナ大学に移って、現在に至ります。
SB-Prologの実行系は、実は、WAMのインタープリタです。つまり、CでWAMの仮想マシン・インタープリタを記述し、実行はWAMインタープリタが行います。
SB-Prologでは、そのほとんどの機能がPrologで記述してあり、Prologのコンパイルがネイティブな機械語でなく、WAMへコンパイルします。

WAMは、極力"ごみ"データが少なくなるように工夫されていますが、大規模な応用プログラムを扱うためには Garbage Collectionが必要となってくるのでWAMを拡張した抽象マシンがいくつか研究されています。
SB-Prologのソースを読むと質問の答が得られると思います。

194 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:36:12 ]
AndroidにはJavaのサブセット内で書かれたDalvik VMが含まれているが、これはレジスタベースになっている。
Dalvikは現在インタプリタ形式だが実機発売時期に合わせてJITに変更するらしい。

195 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:42:33 ]
WAMの命令セットは、Prologの本質をついてるかはわからんが、暗黙的な操作が
多くて大変扱いづらい。手続き型言語の悪い所の見本のような感じ。

誰かがそろそろPrologのVMを再設計してもいい頃。

196 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:48:29 ]
Prolog のコンパイルスキーム
Prologコード → WAM (Warren's Abstract Machine) コード → アセンブリコード → 実アセンブリ

WAMは、レジスタの少ないCPUには向かないのでSWI-Prologは遅いです。
それに比べるとSICStus/QUINtus は、Threaded code というのを使っているのでかなり速い。

AndroidのDalvikもたとえJITにしてもレジスタの少ないCPUでは速度がでないことはほとんど自明です。

197 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:52:37 ]
>>195
>誰かがそろそろPrologのVMを再設計してもいい頃。

すでにある。

>>193
>WAMを拡張した抽象マシン
>>196
>SICStus/QUINtus は、Threaded code というのを使っている

198 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 20:34:50 ]
WAM に問題があるというよりCPUとのマッチングの問題じゃね?

199 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 20:36:33 ]
threaded codeは実装のテクニックであって、VM/AMの命令セット設計の話
とは無関係ですよ。

200 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 20:59:36 ]
SICStus/QUINtus はWAMを使っていないから全く異なる命令セット設計のVM/AMになっている。



201 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 21:13:32 ]
WAMは滅びたんだ。よかった。

202 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 21:36:16 ]
商業ベースでは滅んだ。しかし、我々が使う全てのフリーの実装ではどうしてWAMが使われているのか?

203 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 21:45:41 ]
>>201
こいつムカつくな

204 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 22:37:01 ]
ああよかったよかった、Prologが滅びてw

205 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:19:54 ]
>>189
トン
それだとyaccで作れる構文木って複合項とかに禿げしく限定されない?
:-とか優先度1200の演算子は任せられるか。後は単なるatom?
それだったら自前でパーザ書いても大差なさそうだな

>>190
壮絶に的外れ。
CやJavaでPrologコンパイラを書く場合に構文解析をどうするかって話。
WAMはその後の話。盛り上がってるからいいけど

>>192
MIT PRESSのWAM本は読んだ。

206 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:32:56 ]
prologの授業頑張ってたけど
もっと頑張っとけばよかった・・・


207 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:36:57 ]
>壮絶に的外れ。

親切にレスしてくれてるのによくこんな言葉遣いできるよな

208 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:48:33 ]
Prologerには自意識過剰で人を見下す傾向がありますからw

209 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:51:10 ]
ぶっちゃけ>190の読解力は目を覆わんばかり

210 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:55:16 ]
WAM厨w



211 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:57:15 ]
>>208
たしかにPrologerは電波出してる奴多いんだよw

212 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 13:19:23 ]
>>209
同感w

213 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 14:59:08 ]
ぶっちゃけ>>190はネタだと思って笑い飛ばしていたんだが、マジだったのだろうか

214 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 18:11:46 ]
たまにスレが伸びてると思ったら喧嘩ですか。

215 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:57:25 ]
こんな過疎スレにも荒らしがきてるのか。必死に自演しても見るのは数人しかいないと思うが…

216 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 20:15:17 ]
喧嘩にはなってないだろ。>>190がフルボッコなだけw
>>190の読み違いはプギャーだが顔真っ赤にして反論しないのは大人

217 名前:>>188=205 mailto:sage [2008/05/31(土) 01:09:36 ]
荒れる原因作ってスマソ
だが本題のレスが>189だけなのは残念
ここの住人はProlog処理系もPrologで書くような人達なんだろうな
参考になる資料見つけた(PDF)
THE DESIGN AND IMPLEMENTATION OF A PROLOG PARSER USING JAVACC
ttp://digital.library.unt.edu/permalink/meta-dc-3251:1
JavaCCはPCCTS由来のLL(k)パーザジェネレータで>189と同じやり方。
HaskellのパーザコンビネータParsecをJavaにポートしたJParsecでは
動的な文法が扱える。これらを試してみる

218 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 06:44:21 ]
>ここの住人はProlog処理系もPrologで書くような人達なんだろうな
それが基本だし,今のCPUなら結構使える
他の方法使っても定数倍だろ?

219 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 07:15:42 ]
ただし、日本語だけは勘弁な

220 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 07:24:46 ]
こんなに人居たんだこのスレ・・・



221 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 07:33:45 ]
>>219
?


222 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 08:22:36 ]
Parsecねえ

www.lab2.kuis.kyoto-u.ac.jp/~hanatani/tmp/Parsec.html
> が、 LL(1) 文法と同等の性能を出します。
www.haskell.org/haskellwiki/Parsec
> but it performs best on predictive (LL[1]) grammars.

なんか言ってること違う気がw

223 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:52:05 ]
>>188
CMU Prolog Repository

ttp://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/lang/prolog/0.html

にPrologで書かれたPrologパーサとCで書かれたPrologパーサが
あったと思います.


224 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:56:02 ]
>>193

DEC-10 PrologとWAMの作者のDavid Warrenは,David H. D. Warrenで

ttp://www.informatik.uni-trier.de/~ley/db/indices/a-tree/w/Warren:David_H=_D=.html

SB-Prologの作者のDavid Warrenは,David Scott Warrenで別人です.

ttp://www.informatik.uni-trier.de/~ley/db/indices/a-tree/w/Warren:David_Scott.html


225 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 15:25:12 ]
www.cs.vu.nl/~dick/Summaries/CS/PrologImplementation.html
> Note that David S. Warren is not David H.D. Warren, the author of the Warren Abstract Machine.

やべ知らなかったw

226 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 18:12:58 ]
>>224
乙。

227 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 01:57:40 ]
>>218
演算子を追加できる言語の代表格としてここで聞いてみただけで
対象の言語はPrologじゃないんだ。つか俺にPrologで実装は無理w

>>223
禿げしくトン。これのことかな
ttp://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/code/parsing/lp/0.html
リンク先が切れてるけどここにあった
ftp://ftp.elis.rug.ac.be/prolog/prolog.parser.tar.Z
K&RのCなんて読むの久しぶりだw

228 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 06:54:55 ]
rterm.cのreduceで順序立ててるみたいだから、結局同じなんじゃないの

229 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:38:10 ]
>>228
同じって何と?>189と同じなら>205
> それだったら自前でパーザ書いても大差なさそうだな

230 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:14:22 ]
「演算子っぽいもの」っていうよりも、節を構成する項の列全体(「.」まで)を一旦スタックに積む感じだったよ



231 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:16:44 ]
「項の列」はちょっとまずいか。言い方わかんねw

232 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:36:16 ]
>>230-231
>205の
>:-とか優先度1200の演算子は任せられるか
ってことだよね。','は優先度1000で':-'より強いから


233 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 02:54:23 ]
>>200
> SICStus/QUINtus はWAMを使っていないから全く異なる命令セット設計のVM/AMになっている。

そのVM/AMについて調べたいのですが、どこかに情報あるでしょうか?
「Optimizing the SICStus Prolog virtual machine instruction set」
ftp://ftp.sics.se/pub/SICS-reports/Reports/SICS-T--2001-01--SE.ps.Z
という資料があったのですが、これはWAMを拡張したVMのようです。

234 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 08:10:51 ]
>>188
亀レスだが。一番普通に皆がやってるのは、
SWI-Prologのソースを参照する(盗む)ことだと思う。

235 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:55:42 ]
>>234
質問する前に見たw
188で質問したのは「どうパーズするか?」じゃないんだ。
「パーザジェネレータで」できるかってこと。
動的といってもたかがしれてるんだから構文解析表を
操作すればできるんじゃないかと思ったんだけどね。

236 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:52:51 ]
じゃあこれで
en.wikipedia.org/wiki/Operator-precedence_parser
>$ ./parenthesise a \* b + c ^ d / e
>((((a))*((b)))+(((c)^(d))/((e))))


237 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:30:01 ]
>>236
それ>188=235へのレス?
演算子順位法なんてコンパイラの本に普通に出てくるんだが。
そんなことも知らないと見下されてるわけか。バカにされたもんだな。
自前でパーズする方法を聞いてるんじゃないってことがなぜ伝わらないのか。
「○○というパーザジェネレータを使うと動的に演算子を追加できる」という情報が
あるなら教えて欲しい、それだけだ。

238 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 01:51:09 ]
ネタってことがなぜ伝わらないのか

239 名前:デフォルトの名無しさん [2008/06/14(土) 11:25:57 ]
後出しジャンケンって嫌われる傾向にある

240 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:10:23 ]
喧嘩腰w



241 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 01:20:34 ]
>自前でパーズする方法を聞いてるんじゃないってことがなぜ伝わらないのか。
書き方が悪いってことがなぜ伝わらないのか。

242 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 01:26:15 ]
>>241
少なくとも>235で伝わらないのは読み手の問題だろ。

243 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 01:48:06 ]
自演までしてネタにマジレスカッコ悪いw
頭悪いんじゃねw

244 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 01:59:05 ]
>>243 スマン、俺は>>241だがどこが自演なのか教えてくれないか

245 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 11:04:14 ]
Prologの話しろよクソども

246 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 21:55:57 ]
>>245
だいべんしてくれてありがとう

247 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 00:39:19 ]
>>245-246
糞TALK(藁

248 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 00:44:26 ]


           バカ専用      普通  ハッカー ウィザード
             ┝ - - - - ┿━━━┿━━━┥
   ∩___∩   /)
   | ノ      ヽ  ( i )))
  /  ●   ● | / /
  |    ( _●_)  |ノ /   今はここら辺クマーー!!
 彡、   |∪|    ,/
/    ヽノ   /



249 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:21:02 ]
まったりするスレだってことがなぜ伝わらないのか

250 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 03:50:56 ]
         2chでスレ荒らし   普通  ハッカー ウィザード
             ┝ - - - - ┿━━━┿━━━┥
   ∩___∩   /)



251 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 05:36:33 ]
Ubuntu7.1 で
Progol4_4 をmakeするとエラーに
なるのですが、なにかご存知の方、
コメントをください。 
# sudo sh expand.sh
・・・解凍して展開・・・
gcc -O2 -c -o command.o command.c
command.c: In function 'c_interp':
command.c:55: error: 代入として無効な左辺値です
とメッセージがでます。

252 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 06:53:04 ]
command.c:55: error: 代入として無効な左辺値だってことがなぜ伝わらないのか

253 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 07:07:11 ]
>>252
それは、判るのですが、どうすればいいのでしょうか?

254 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:24:24 ]
左辺値をキャストしちゃダメなんだそうで。
c-faq.com/ptrs/castincr.html
www.kouno.jp/home/c_faq/c4.html#5
> キャスト は変換演算子であって、それは右辺値を生みだすと定義されている。
> 右辺値であるとするなら、代入することも++で足し算することもでき ないことになる
> (pccから派生したコンパイラやgccの拡張機能が上の ような式を受け付けることは例外である)。

書き直す(左辺値用のマクロを用意する?)のが正しいと思うけれど、
gccのオプションをいじればどうにかなるのかも、なんて思ったりして。

255 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:28:15 ]
いや、なんか適当にポインタを取ったりすればいいのかもしれない。適当。

256 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:01:28 ]
しったかぶってただけでしたw

257 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:02:57 ]
>>251
gcc.gnu.org/ml/gcc-help/2007-05/msg00082.html
この人の場合、どうやら古いgccでコンパイルしなおしたらしい。
pagaddedって何かわかんないけど

258 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:45:24 ]
そんなことも知らないと見下されてるわけか。バカにされたもんだな。
そういうことを聞いてるんじゃないってことがなぜ伝わらないのか。
情報があるなら教えて欲しい、それだけだ。

259 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:54:17 ]
> By the way, I'm running the latest version of gcc on a Sunblade 100 workstation.

だからpkgadd(ed)、かな

260 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:42:27 ]
command.c
> CTYPE(cclause)=pdot0;

progol.h
> typedef int BOOL, INT;
> typedef long int LONG;
> typedef double DOUBLE;
> typedef char *STRING;
> typedef char *POINTER;
:
> #define I_GET(i) ((i)->obj)
:
> #define CTYPE(c) ((LONG)I_GET(F_ELEM(2l,(c))))
:
> struct item {
:
> POINTER obj;

世の中間違ってる



261 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:51:16 ]
> #define CTYPE(c) ((LONG)I_GET(F_ELEM(2l,(c))))

#define CTYPE(c) (*(LONG *)&I_GET(F_ELEM(2l,(c))))

こんなんできたっけ

262 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 21:50:26 ]
            普通      まったり  超まったり dat落ち寸前
             ┝ - - - - ┿━━━━┿━━━━━┥
   ∩___∩   /)

263 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 23:26:45 ]
>>262
2ちゃんに「普通」なんつー概念はありえねーw

264 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 23:32:25 ]
自分以外を「2chでスレ荒らし」と言ってる奴だから、対話は成立しないだろ。ほっとけ。

265 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:23:04 ]
Prologって何の問題を解くのに向いているのでしょう?
手続き的な処理には不向きな気がします。
私はこのスレを読んでシステムの用件定義時に個別の用件の妥当性
をチェックするなどに使えるかな?と思っています。
ミナサンはどんな問題を解くのに使われていますか?

ちなみに、Javaや.Netなどから呼び出せたりするPrologってありませんか?

266 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:50:23 ]
kaminari.scitec.kobe-u.ac.jp/PrologCafe/
www.cs.kuleuven.ac.be/~bmd/PrologInJava/

267 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:18:30 ]
>>264
何か誤解されているようですが。

268 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:48:04 ]
P# というのもあります。
homepages.inf.ed.ac.uk/jcook/psharp/psharp-1.1.3/dlpsharp.html
Prolog から C# へのトランスレータということになります。
>>266 にでてくる PrologCafe で書かれています。

269 名前:251 mailto:sage [2008/06/17(火) 02:59:52 ]
皆さんの示唆によりまして、
めでたく、Progolの起動まで漕ぎ着けました。
ひとまず、ありがとうございます。
ひとまずというのは、
>>261 はその通り直したのですが、同様にエラーのでた
(LONG) を「なんか適当にポインタを取ったり」という感じで
コメントアウトしてしまったらうまく行った、ということです。
それでは、問題があるかもしれないから、今日
(LONG)を生かす方法を試みます。


270 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:38:51 ]
>>265
Prologの手続的解釈というのもあります。あくまで、Prologをどう読むかということですが。
プログラマが副作用に着目している以上、深さ優先探索を「悪用」して、
あーやって、つぎにこうやって、という具合に読んでいくことは現実味があります。
関数型ではPrologから影響を受けたErlangが似た構文を持っています。




271 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 04:37:35 ]
>>261です

piza.2ch.net/tech/kako/968/968727266.html
>1 名前: 厨房エログラマ 投稿日: 2000/09/12(火) 11:54
> unsigned long a = 0xcccccccc;
> (unsigned char)a = 0xff;
> このようなコードをみました。
> VC++で試したところ、拡張子CPPではエラーになりましたが、
> 拡張子Cでは問題なく通り、aの値は 0xccccccff になりました。
> この代入はC言語の規則上では正しいのでしょうか?

>10 名前: >8 投稿日: 2000/09/13(水) 08:15
> ANSIでは(unsigned char)aは左辺値じゃないから代入文の左辺に
> は置けない。これはANSIでは「処理系依存」ではない。

> この記述ができるコンパイラはANSIに従っていない。このため
> VC6も-ZaでこのMS拡張仕様を無効にする手段を用意している。

> gccではコンパイルできるが結果は0xccccccffでなく
> 0x000000ffになる。同様に-ansi -pedanticをつけて厳格に
> ANSIに準拠させるとエラーとなる。

> 言語仕様を(暗記せよとはいわないが)調べるぐらいしたら

sizeof(LONG) == sizeof(POINTER)
という仮定がされている、という仮定をしてしまった気がするとです






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

前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