Prologでまったり Par ..
[2ch|▼Menu]
129:デフォルトの名無しさん
08/05/02 06:12:13
凄く初心者質問だと思うのですが
Prolog に方程式を解かせることって出来ますか?
ごく簡単な式で良いんです。例えば

2 + X = 5

とかそんな感じです。

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


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

132:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/02 06:44:55
ごめんなさい。2 + X のはずが2行目から以後、2 + 5 になってしまいました。
5をX に置き換えて読んでください。

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

ではだめかw


135:デフォルトの名無しさん
08/05/02 08:58:19
そりゃ反則だw

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

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

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

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

141:デフォルトの名無しさん
08/05/02 12:53:53
方程式を素で解くなら Mathematica とか Maple とか使うことになるな。

142:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/02 12:55:59
頭いいなw

144:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/02 13:08:33
>>144
ざっと見て計算量がA×C以上になっちゃいそうだなw

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

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

148:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/03 10:44:31
>>149
これは is 評価を使わないでpnだけで行こうとすると
ループに陥るのかな?

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

152:デフォルトの名無しさん
08/05/03 13:34:20
 変数を

P、Nの両方に

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


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

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

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

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

158:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/03 21:54:21
いやこうか
twice(A,B) :- pn(PA,z, A,0), pn(PA,z, B,A), !.

どうでもいいw

160:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/04 20:14:30
別に以下のように引数位置の意味を定義しておくこともあります。
task管理引数位置(1,task).
task管理引数位置(2,内容).
task管理引数位置(3,先行task).
task管理引数位置(4,期間).
task管理引数位置(5,人数).


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

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

164:デフォルトの名無しさん
08/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
08/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
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/05 12:46:40
>>128貴重な情報ありがとうございます。
購買系のシステムに適用できないか検討中でしたので参考になりました。
Prologの処理系は何か商用のものを利用されているのでしょうか?


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

170:デフォルトの名無しさん
08/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のはず.

参考:
URLリンク(www.sics.se)

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

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

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

173:デフォルトの名無しさん
08/05/06 18:27:45
=:= や is だとどういうルールになりますか

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

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

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


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

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

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

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

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


183:デフォルトの名無しさん
08/05/15 07:43:27
1億回で1秒くらいかねw

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

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


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

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

186:デフォルトの名無しさん
08/05/21 12:54:20
>>185
同感。

187:デフォルトの名無しさん
08/05/21 18:16:09
interlogなんてHPもなくなってるジャマイカw

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

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

190:デフォルトの名無しさん
08/05/29 18:38:14
>>188
Java VM などと Warren AM の違いを質問しているのかな?

191:デフォルトの名無しさん
08/05/29 18:42:00
>>190
エスパーですか

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

193:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/29 19:36:12
AndroidにはJavaのサブセット内で書かれたDalvik VMが含まれているが、これはレジスタベースになっている。
Dalvikは現在インタプリタ形式だが実機発売時期に合わせてJITに変更するらしい。

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

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

196:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/29 19:52:37
>>195
>誰かがそろそろPrologのVMを再設計してもいい頃。

すでにある。

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

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

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

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

201:デフォルトの名無しさん
08/05/29 21:13:32
WAMは滅びたんだ。よかった。

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

203:デフォルトの名無しさん
08/05/29 21:45:41
>>201
こいつムカつくな

204:デフォルトの名無しさん
08/05/29 22:37:01
ああよかったよかった、Prologが滅びてw

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

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

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

206:デフォルトの名無しさん
08/05/30 00:32:56
prologの授業頑張ってたけど
もっと頑張っとけばよかった・・・


207:デフォルトの名無しさん
08/05/30 00:36:57
>壮絶に的外れ。

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

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

209:デフォルトの名無しさん
08/05/30 00:51:10
ぶっちゃけ>190の読解力は目を覆わんばかり

210:デフォルトの名無しさん
08/05/30 01:55:16
WAM厨w

211:デフォルトの名無しさん
08/05/30 01:57:15
>>208
たしかにPrologerは電波出してる奴多いんだよw

212:デフォルトの名無しさん
08/05/30 13:19:23
>>209
同感w

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

214:デフォルトの名無しさん
08/05/30 18:11:46
たまにスレが伸びてると思ったら喧嘩ですか。

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

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

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

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

219:デフォルトの名無しさん
08/05/31 07:15:42
ただし、日本語だけは勘弁な

220:デフォルトの名無しさん
08/05/31 07:24:46
こんなに人居たんだこのスレ・・・

221:デフォルトの名無しさん
08/05/31 07:33:45
>>219
?


222:デフォルトの名無しさん
08/05/31 08:22:36
Parsecねえ

URLリンク(www.lab2.kuis.kyoto-u.ac.jp)
> が、 LL(1) 文法と同等の性能を出します。
URLリンク(www.haskell.org)
> but it performs best on predictive (LL[1]) grammars.

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

223:デフォルトの名無しさん
08/05/31 14:52:05
>>188
CMU Prolog Repository

URLリンク(www.cs.cmu.edu)

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


224:デフォルトの名無しさん
08/05/31 14:56:02
>>193

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

URLリンク(www.informatik.uni-trier.de)

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

URLリンク(www.informatik.uni-trier.de)


225:デフォルトの名無しさん
08/05/31 15:25:12
URLリンク(www.cs.vu.nl)
> Note that David S. Warren is not David H.D. Warren, the author of the Warren Abstract Machine.

やべ知らなかったw

226:デフォルトの名無しさん
08/05/31 18:12:58
>>224
乙。

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

>>223
禿げしくトン。これのことかな
URLリンク(www.cs.cmu.edu)
リンク先が切れてるけどここにあった
fURLリンク(ftp.elis.rug.ac.be)
K&RのCなんて読むの久しぶりだw

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

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

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

231:デフォルトの名無しさん
08/06/02 00:16:44
「項の列」はちょっとまずいか。言い方わかんねw

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


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

そのVM/AMについて調べたいのですが、どこかに情報あるでしょうか?
「Optimizing the SICStus Prolog virtual machine instruction set」
fURLリンク(ftp.sics.se)
という資料があったのですが、これはWAMを拡張したVMのようです。

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

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

236:デフォルトの名無しさん
08/06/13 20:52:51
じゃあこれで
URLリンク(en.wikipedia.org)
>$ ./parenthesise a \* b + c ^ d / e
>((((a))*((b)))+(((c)^(d))/((e))))


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

238:デフォルトの名無しさん
08/06/14 01:51:09
ネタってことがなぜ伝わらないのか

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

240:デフォルトの名無しさん
08/06/14 12:10:23
喧嘩腰w

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

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

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

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

245:デフォルトの名無しさん
08/06/15 11:04:14
Prologの話しろよクソども

246:デフォルトの名無しさん
08/06/15 21:55:57
>>245
だいべんしてくれてありがとう

247:デフォルトの名無しさん
08/06/16 00:39:19
>>245-246
糞TALK(藁

248:デフォルトの名無しさん
08/06/16 00:44:26


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



249:デフォルトの名無しさん
08/06/16 02:21:02
まったりするスレだってことがなぜ伝わらないのか

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

251:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/16 06:53:04
command.c:55: error: 代入として無効な左辺値だってことがなぜ伝わらないのか

253:デフォルトの名無しさん
08/06/16 07:07:11
>>252
それは、判るのですが、どうすればいいのでしょうか?

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

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

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

256:デフォルトの名無しさん
08/06/16 16:01:28
しったかぶってただけでしたw

257:デフォルトの名無しさん
08/06/16 17:02:57
>>251
URLリンク(gcc.gnu.org)
この人の場合、どうやら古いgccでコンパイルしなおしたらしい。
pagaddedって何かわかんないけど

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

259:デフォルトの名無しさん
08/06/16 17:54:17
> By the way, I'm running the latest version of gcc on a Sunblade 100 workstation.

だからpkgadd(ed)、かな

260:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/16 21:50:26
            普通      まったり  超まったり dat落ち寸前
             ┝ - - - - ┿━━┿━━━┥
   ∩___∩   /)

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

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

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

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

266:デフォルトの名無しさん
08/06/17 01:50:23
URLリンク(kaminari.scitec.kobe-u.ac.jp)
URLリンク(www.cs.kuleuven.ac.be)

267:デフォルトの名無しさん
08/06/17 02:18:30
>>264
何か誤解されているようですが。

268:デフォルトの名無しさん
08/06/17 02:48:04
P# というのもあります。
URLリンク(homepages.inf.ed.ac.uk)
Prolog から C# へのトランスレータということになります。
>>266 にでてくる PrologCafe で書かれています。

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


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


271:デフォルトの名無しさん
08/06/17 04:37:35
>>261です

URLリンク(piza.2ch.net)
>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)
という仮定がされている、という仮定をしてしまった気がするとです


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

5387日前に更新/90 KB
担当:undef