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

2 名前:デフォルトの名無しさん [2007/10/26(金) 09:09:35 ]
2

3 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:18:13 ]
最新のスレッド(Prolog) :- 3.

4 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:18:05 ]
乙(1).

5 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 19:42:17 ]
ERROR: Undefined procedure: 乙/1

6 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:35:24 ]
live(乙一).

7 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:45:32 ]
ERROR: Suspended writer: 乙一

8 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:55:15 ]
:- 乙(>>(1)).

9 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 10:04:39 ]
?- halt.

10 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:22:18 ]
半日で(67)か。age進行のスレが多いのだな。
ちょっと質問です。
皆さんが使っているTCP/IP関連の述語を教えてください。
組込、ユーザ定義を問わず。
できれば、引数の定義域が解るといいな。
ライブラリを作ろうとか、標準化を考えようなどと
いうのではないけれど、皆さんがどのレベルまで
抽象化して使っているかは知りたい。



11 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 15:26:23 ]
本当の意味でのPrologの第一世代は1960年生まれですね。
大学卒業時にICOTの活動が始まったという世代です。
この人達が、リタイアするのは2020年以降。ここから
Prologの再興が始まるのでしょうね。具体的には、
金も少しはあり、青春時代の思い出に浸る余裕を持った
人たちが、集まって論理プログラミングをテーマとする
会社を興す。研究会を始める。そんな動きが期待されます。
だから当分は、Prologでまったり、ですね。

12 名前:デフォルトの名無しさん [2007/11/03(土) 00:39:09 ]
最近prologを勉強し始めました。
疑問なのですが、prologで作ったプログラムをGUI化することはできるのでしょうか?
javaでプログラムのGUI化はしたことがあるんですが、
prologはどうやればいいのか見当もつきません。
どなたか教えて頂けませんでしょうか?

13 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:35:48 ]
>>12
ISOの標準ではグラフィックについての言及はありません。したがって、
個々の処理系対応ということになります。
・ Windows環境のみですが最もグラフィック述語の完備しているのはVisualPrologでしょう
・ SWI-PrologはXPCEというグラフィックライブラリを最初に付加インストールしておけば
・ MinervaやPrologCafeといったJava系PrologはJavaのクラスを呼びだすことによって可能だと思います。
・ K-PrologだとTCK/TLのインターフェイスがあるのでこれを使うのでしょう。
write等CUI用の述語を含む定義を ?- cui2gui(foo/0). のように一発で
GUI対応のひな形に変換する述語や外部コマンドの存在は聞いたことがありません。
なお、VisualProlog,Minerva,K-Prolog は有料です。

14 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 07:26:31 ]
SICStus-Prologやgprolog(GNU-Prolog)も広く使われていますが私は知りません。
AZ-PrologはProlog-KABA互換から発展してきたものですが、Windows版には
GUI述語があるようです。 ttp://www.sofnec.co.jp/az-demo/

15 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 08:33:14 ]
>>13 >>14
に代表的なProlog処理系を挙げたと思うのですが、この中で、
日本語処理が満足な水準なのは、
SWI-Prolog K-Prolog Minerva IF/Prolog(上にはない) AZ-Prolog
で他はだめですね。私にとってはこれは絶対的な条件ですから、
他のPrologは興味がありません。

16 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:52:44 ]
悲しむべきお知らせ。
"PROLOG Programming for Artificail Intelligence" Ivan Bratko著の
最新版の出版が来年の五月に延びてしまいました。

17 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 17:27:20 ]
1980年代から90年代にかけて、Prologが全盛期であったことは
大方の認めるところ。この時期に書かれたPrologの記事は
その微妙な時期的な問題から、今日Web上で参照することが
難しい。著作権、版権の問題があり、勝手に公開することは
勿論できません。しかし、これは残念なことです。
今日も、"Functional Grammer in Prolog" Simon C.Dik著と
いう本を開いてため息をついてしまいました。本を開いたら、
いきなりヒバリのさえずりが聞こえた、という例えがあり
ますが、そんな本です。ああ、こんな本を、Webが良いというなら
そこに公開してあげたいな。そっくり、タイプするくらいの
手間なら厭わないのに。残念。
Prologの本って、和書も含めて、そんな本だらけです。当時は
ちょっと馬鹿にして読まなかった本が実に工夫されて良く書けて
いる。どれも味があります。

私、もうすぐ死ぬのかな?


18 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 17:30:13 ]
例え ではなくて 譬えか

19 名前:デフォルトの名無しさん [2007/11/06(火) 03:57:12 ]
>>15 で日本語処理という話がでましたが
極めて簡単な日本語処理テストの方法を書いておきます。
?- assertz((山田(_太郎) :- write(_太郎))).
yes
?- 山田(太郎).
太郎
yes
?-
この通り動けばほぼ合格とみてよいでしょう。
ただ、文字コードのある領域だけエラーになると
いう例もあったので、完全ではありません。

20 名前:12 mailto:sage [2007/11/06(火) 07:57:26 ]
皆様ありがとうございます。
prologで作ったプログラムはHTMLで表示可能なのでしょうか?
現在、prologで旅行経路検索プログラムを作っているのですが、
これをWeb上でクリックや数字を入力して利用できるようにしたいのです。
やはり素人には難しいですか?



21 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 01:58:30 ]
ラッパー被せたらなにも問題ないと思うけど、、

まあ、標準出力のはじめにヘッダー吐くようにしておけば、あとは普通に標準出力でかまわないね。
ただ、インタラクティブな操作はすこし難儀そうだ。

22 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 04:31:17 ]
自宅サーバの場合は問題ないが、サーバがプロバイダの環境にあるときは、
サーバサイドでPrologが使えることが条件。一番簡単な方法は
CGIをPerlでやって、その中でsystem("Prolog ... ")でPrologを呼びだす。
引数の中にtmpnam(一時的なファイル名)を含めておく。
GETメソッドの入力情報はそのままQUERY_STRINGをPrologでgetenvすればよい。
Prologは受け取った情報を解析して(splitの処理)利用し、結果を ...
?- atom_append(TMPNAM,'.html',HTMLファイル名),
open(HTMLファイル名,write,Output), ... ,write(Output,'<html>\n'), ... ,write(Output,'</html>\n'),
close(Output),halt.
これで、Perl側のsystem("prolog ... ") は終了するから、
print "Location: tmpnamのURL " print ".html\n\n"
までやってそれからPerlを終了させればよい。POSTメソッドの場合は
後で。GETを使うかPOSTを使うかはあなたに主導権があるから、
一応これでできるはず。

23 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:10:20 ]
QUERY_STRINGから受け取った情報はPrologで読める形式に戻す
必要がある。
使うPrologにライブラリがあれば別だが、ないと、
以下のようなパーツが必要になる。
% *** user: replace_query_2 / 3 ***
replace_query_2('2','F',/) :- ! .
replace_query_2('2','8','(') :- ! .
replace_query_2('2','9',')') :- ! .
replace_query_2('2','B',+) :- ! .
replace_query_2('2','D',-) :- ! .
replace_query_2('2','7','''') :- ! .
replace_query_2('2','7','''') :- ! .
<略>
漢字コードの変換はさらに面倒。
これは長くなるので、どうしても必要なら、
pc11.2ch.net/test/read.cgi/mysv/1188833105/
で質問してください。

24 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:16:29 ]
漢字コードを極力使わないためにはHTMLファイルの
selectタグを
<select name="ekimei">
<option value="shibuya">渋谷</option>
<option value="shinjuku">新宿</option>
</select>
のように返ってくる値をローマ字に変換すればよい。
勿論inputタグは使わない。
これに徹すればPrologの解析部分は随分と楽です。

25 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 14:19:38 ]
tuPrologがなかなかいい件

26 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 16:11:51 ]
>>25
私は使い方が全くわからず放棄したまま。

27 名前:23 mailto:sage [2007/11/07(水) 16:34:28 ]
リンクを間違えました。(答えが長くなりそうな質問は、)
pc11.2ch.net/test/read.cgi/mysv/1102662133/
でした。随分前に私が立てたスレです。ソースコードを
どんどん貼り付けて構いません。

28 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 16:43:30 ]
>>26
まぁ単体で使っていいことはないんだけどね.
俺は自前のJavaプログラムからtuPrologの機能使ってるんだが,
かなりいい感じ.Java同士だから相性抜群てとこかな.
マニュアルもしっかりしてるところも嬉しい.
Javaから使った場合は最高(使いやすさは).

使い方はダウンロード&解凍→ 2p.jarってのが実行ファイル
これがIDEっぽい感じ.

日本語は△ってとこかな.
IDE使うと日本語は書けない.
でも,テキストエディタで書いてtuPrologで読込むと
文字化けして日本語が全部"□"になってしまうんだが,
きっちり認識されてて,実行できる.

29 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:10:42 ]
>>28
ありがとう。version 2.1 が動きました。
IDE風の実行環境では、
>>19 の日本語テストは完全に動きました。
OSはRedhat9なのですが、文字コードがEUCのせいですね。

30 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:26:27 ]
FedoraCore5でもやってみましたが、同じ結果となりました。
一つ気になることは Output という表示で
'太郎' となることです。
?- tell(temp),山田(太郎),told.
を実行してファイルtempを見てみるとやはり、'太郎'になっています。
'を削除するというやっかいな仕事が後に残りそうです。



31 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:31:09 ]
私のFedoreCore5の環境は
# mkdir $JAVA_HOME/jre/lib/fonts/fallback
# ln -s /usr/share/fonts/japanese/TruType/*.ttf $JAVA_HOME/jre/lib/fonts/fallback/.
が掛かっています。

32 名前:31 mailto:sage [2007/11/07(水) 20:33:22 ]
/TruType/ ではなく /TrueType/ ですね。

33 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:03:10 ]
このtuPrologを使うと、JavaServletからPrologを
呼びだすというようなことが自在になるのでしょうか。
そうだとすると、面白いですね。
MinervaだとJavaAPIの各クラスが簡単な指定で、
Prologの述語として定義できてしまいます。
tuPrologではどうでしょうか。

34 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:11:18 ]
tuPrologのサイトってこれ?
ttp://tuprolog.alice.unibo.it/
sourceforge逝ってもここに飛ばされるけど403なんだぜ

35 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:54:55 ]
>>34
俺は
sourceforge.net/projects/tuprolog
でダウンロードした希ガス

>>33
サーブレットは詳しくないが,サーブレットからもいけると思うよ.
tuProlog自体がJavaだからね.
あと,マニュアルのChapter 6 Accessing Java from tuProlog
あたりにPrologからJava操作するのが載ってるような

36 名前:34 mailto:sage [2007/11/07(水) 23:18:43 ]
>>35
トン

37 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 07:19:56 ]
以下のような参照をしたい場合があります。

?- _締日@>='20070901',_締日@=<'20071031',売掛(_顧客,_締日,_前残,_入金,_売上).

これは普通のPrologインタプリタではエラーとなります。それをなんとかしたい。
という場合があるということです。
?- 売掛(_顧客,_締日,_前残,入金,売上),_締日@>='20070901',_締日@=<'20071031'.
で何故だめなのか? 外部のデータベースを参照する場合具合が悪いのです。あとの質問が
?- select * into X from 売掛,
member([_顧客,_締日,_前残,_入金,_売上],X),
_締日@>='20070901',_締日@=<'20071031'.
に変換されたとします。これですと、売掛テーブルに50万タップルあったと
するとスタックオーバーフローの危険が生じます。TCP/IP経由で
これだけのデータを受け取るのには相当の時間もかかるでしょう。それで、
?- select * into X from 売掛 where 締日>='20070901' and 締日<='20071031'.
に変換したいものです。 <以下、続く>

38 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 07:27:40 ]
?- select * into X from 売掛 where 締日>='20070901' and 締日<='20071031',
member([_顧客,_締日,_前残,_入金,_売上],X). でしたね。memberを落としてしまいました。

後の質問から、この節を導くのが難しいのですが、最初に示したエラーに
なる質問からだとそれほど難しくありません。
基本的にはtracer(debugger) の話ですが、制約論理プログラムや遅延評価への
ヒントもすこしは含む話になります。

39 名前:デフォルトの名無しさん [2007/11/09(金) 07:52:40 ]
Prologの内部データベースを参照しているコードでは
?- 売掛(_顧客,_締日,_前残,入金,売上),_締日@>='20070901',_締日@=<'20071031'.
の順序であり、これを外部データベース参照用に切り替えたいという要求も
当然ありますから、難しいとは言ったけれど、この話の最後に研究してみましょう。

40 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 10:21:02 ]
Prologでまったり-2に書いたbit誌 1986年6月号に戸村哲・小方一郎 両氏による「Prolog in Prolog」と
いう引用記事を再掲します。
solve(Var,_) :- var(Var),!,fail.
solve( !,V) :- !,cut(V).
solve(true,_) :- !,true.
solve(fail,_) :- !,fail.
solve((A,B),V) :- !,solve(A,V),(var(V),solve(B,V);nonvar(V),true).
solve((A;B),V) :- !,(solve(A,V);solve(B,V)).
solve(P,V) :- functor(P,Functor,Arg),not(predicate_type(Functor/Arg,linear)),!,cal
l(P).
solve(P,V) :- !,clause(P,Q),solve(Q,W),(nonvar(W),!,fail;true).
cut(_).
cut(cut).

これに Var @>= atom がエラーにならないように細工しましょう。
solve(fail,_) :- !,fail. の後に
solve(Var @>= X,_) :- (var(Var);var(X)),!. を挿入することで
エラーになることは回避できます。しかし、これではただtrueと解釈した
ことと変わりません。Var @>= X をどこかに保存して、後で、利用したい。




41 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 13:23:28 ]
... , 売掛(_顧客,_締め日,_前残,_入金,_売上), ... で参照(照会の方がいいか)時、
Prologデータベースに述語定義がある場合とない場合がある。ここでは話を
わかりやすくするために、述語定義のない場合のみ扱う。
solve(P,V) :- functor(P,F,A),predicate_type(F/A,undefined),solve(# P,V),!. を
solve(P,V) :- !,clause(P,Q),solve(Q,W),(nonvar(W),!,fail;true). の上に挿入する。
そして、述語 #/1 の定義を
solve(# P,V) :- !, ここにデータベース照会のBODYが来る
solve(P,V) :- functor(P,F,A),predicate_type(F/A,undefined),solve(# P,V),!.
solve(P,V) :- !,clause(P,Q),solve(Q,W),(nonvar(W),!,fail;true).

インタプリタの定義は節の構成としてはこんな感じでよい。問題は、制約情報の渡し方だ。
そして、データベース照会述語 #/1 の定義。
結論を言ってしまえば、制約情報の伝達は assertz(制約情報(_締日 @>= '20070901'))
のような述語定義で渡すことはできない。

42 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 13:31:29 ]
この問題の簡単な実験をする。
?- X = Y,assertz(foo(Y)),foo(Z),Z==X.
no
になる。assertz時の Y に対するリンクから foo(Z) のZは
切り離されている。ただし、間違えて、
?- X = Y,assertz(foo(Y)),foo(Z),Z=X. としないように。
後でこういう失敗の例を挙げるがX,Yとは無関係であっても、
Zは単なる変数、XやYと単一化してしまう。これだと実験にならない。

43 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 14:37:11 ]
述語定義による変数情報の受け渡しがうまくないとすると、
引数による渡しということになる。ストリームを架ける。
全ての述語定義の第一引数にこのストリームを付加すると
いう行き方もあるが、それはしたくない。
solveの変更だけですむだろうか。
solve(V1 @>= V2,V,V1 @>= V2) :- (var(V1);var(V2)),!.
solve(# P,V,L) :- !,
solve(P,V,L) :- functor(P,F,A),predicate_type(F/A,undefined),solve(# P,V,L),!.
solve(P,V,L) :- !,clause(P,Q),solve(Q,W,L),(nonvar(W),!,fail;true).
でどうか。
これだと ?- _締日 @>= '20070901',_締日 @=< '20071031', のような場合には対応できない。
Lを重リストにする、という案がすぐに浮かぶが重リスト自体初心者には
理解しにくいので、
solve(P,V,L,L) :- functor(P,F,A),not(predicate_type(F/A,undefined)),not(predicate_type(F/A,linear)),!,call(P).
solve(V1 @>= V2,V,L1,[V1 @>= V2|L1]) :- (var(V1);var(V2)),!.
solve(# P,V,L1,L2) :- !, ここで 変数情報から where 締日 >= '20070901' and 締日 <= '20071031', を生成する
solve(P,V,L1,L2) :- functor(P,F,A),predicate_type(F/A,undefined),solve(# P,V,L1,L2),!.
solve(P,V,L1,L2) :- !,clause(P,Q),solve(Q,W,L1,L2),(nonvar(W),!,fail;true).


44 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 14:39:28 ]
これで、solveの節定義は大体できあがり。最後に、 #/1の定義。
# _副目標 :-
  _副目標 =.. [_関係表名|_引数ならび],
  select cname into _属性名ならび from col where tname=_関係表名,
  条件の選別(_属性名ならび,_引数ならび,_条件句候補),
  ( not(_条件句候補=[]),
  条件句の作成(_条件句候補,_条件句),
  select *
  into X
  from _関係表名
  where _条件句;
  _条件句候補=[],
  select *
  into X
  from _関係表名
  ),
  member(_引数ならび,X).

あとは、条件の選別/4で [_締日 @>= '20070901',_締日 @=< '20071031']を
[締日 >= '20070901',締日 <= '20071031'] に変換します。


45 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 14:52:23 ]
条件の選別([],[],[],VL) :-
  ! .
条件の選別([[A|_]|R1],[B|R2],[A = B|R],VL) :-
  \+(var(B)),
  条件の選別(R1,R2,R,VL),
  ! .
条件の選別([[A]|R1],[B|R2],[A >= B2|R],VL) :-
  var(B),
  member(B1 @>= B2,VL),
  B==B1,
  条件の選別(R1,R2,R,VL),
  !.
条件の選別([[A]|R1],[B|R2],[A <= B2|R],VL) :-
  var(B),
  member(B1 @=< B2,VL),
  B==B1,
  条件の選別(R1,R2,R,VL),
  !.
条件の選別([_|R1],[_|R2],R,VL) :-
  条件の選別(R1,R2,R,VL).

条件句の生成/4 は and で繋いでいるだけです。

46 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 15:17:16 ]
条件句の生成/4 出はなくて 条件句の作成/4 でした。

以上で大体(細部には問題有り)できあがりですが、もう一度どうして
こんなことを長々書くのか説明して終わります。
15年以上前ですが、Prolog処理系の作成者として有名なK氏とSQLの集約命令に
ついて、雑談していました。その中でK氏がSQLのgroup by 句はよくない。
あれですんなり理解できる素人は少ないとの意見を述べられました。そして、
PrologのQueryのようなもので代替するべきことを暗に指摘しました。
私もK氏とまったく同意見でその時以来これは私のテーマの一つとなり、
実務で使用するデータベース照会述語を少しずつSQLからProlog述語に置き換えて
いったのです。今回は最も単純なものを載せました。
このほかにも、中島秀之氏が提唱されたことのある「項記述」を借用したもの
などに奥行きを感じました。これは、述語呼び出しに手を入れるもので、
売掛(_顧客,{_締日|_締日@>='20070901',_締日@=<'20071031'},_前残,_入金,_売上),
のような呼び出し方になります。もとの副目標としての形式を毀してしまうので、
使いにくいのですが、考えてみれば、_締日 @>= '20070901', を呼び出しの
前に追加挿入することも同じことですから、これでよいのかも知れません。

47 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:12:50 ]

おもしろかった。

48 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:08:17 ]
>>45
大変なミス。# _副目標 :- ... はsolve/4のインラインでないと変数情報が
渡せませんでした。

solve(# P,V,L1,L2) :-
  !,
  P =.. [_関係表名|_引数ならび],
  select cname into _属性名ならび from col where tname=_関係表名,
  条件の選別(_属性名ならび,_引数ならび,_条件句候補,L1),
  ( not(_条件句候補=[]),
  条件句の作成(_条件句候補,_条件句),
  select *
  into X
  from _関係表名
  where _条件句;
  _条件句候補=[],
  select *
  into X
  from _関係表名
  ),
  member(_引数ならび,X).
でなくてはいけません。ただし、( ) の部分は別述語として定義する
べきでしょう。

49 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:10:07 ]
Prologの変数同士の単一化には陥穽があって、

条件の選別([[A]|R1],[B|R2],[A >= B2|R],VL) :-
  var(B),
  member(B1 @>= B2,VL),
  B==B1,
  条件の選別(R1,R2,R,VL),
  ! .

条件の選別([[A]|R1],[B|R2],[A >= B2|R]) :-
  var(B),
  member(B @>= B2,VL),
  条件の選別(R1,R2,R,VL),
  ! .
とやると、
select * into X
from 売掛
where 顧客番号='20070901'
and 締日>='20070901'
and 前残>='20070901'
and 入金>='20070901'
and 売上>='20070901',

というQueryを生成して見事に失敗します。
初心者の人はなぜそうなるか考えてみてください。

50 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:11:29 ]
顧客番号 ではなく 顧客 ね。



51 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:26:02 ]
>>48
solve(# P,V,L1,L2) :- !,データベース呼び出し(P,L1).

データベース呼び出し(_副目標,L1) :-
  _副目標 =.. [_関係表名|_引数ならび],
  select cname into _属性名ならび from col where tname=_関係表名,
  条件の選別(_属性名ならび,_引数ならび,_条件句候補),
...

でよいのか。

52 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:29:08 ]
またしくじった!!
solve(# P,V,L1,L2) :- !,データベース呼び出し(P,L1).

データベース呼び出し(_副目標,L1) :-
  _副目標 =.. [_関係表名|_引数ならび],
  select cname into _属性名ならび from col where tname=_関係表名,
  条件の選別(_属性名ならび,_引数ならび,_条件句候補,L1),
...

ですね。


53 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 20:13:55 ]
どなたか、P# の使い方を教えてください。Redhat9 で mono が動いています。
# cat ap.pl
ap([],X,X).
ap([U|X],Y,[U|Z]) :- ap(X,Y,Z).

# mono /root/psharp/Psharp-1.1.3/PsharpIntrp.exe

P# 1.1.3
Copyright(C) 2003 J.J.Cook

Based on:

Prolog Cafe 0.4.4, 0.6.1
Copyright(C) 1997-2003 M.Banbara and N.Tamura
Small Prolog Interpreter
| ?- compile(ap).

{translating ap.pl into C#...}
{ap.pl translated, 1523 msec}

yes
| ?-halt.

# ls -l *.cs
-rw-r--r-- 1 root root 4290 11月 9 20:06 Ap_3.cs
# mcs /r:Psharp.dll /out:Ap_3.exe Ap_3.cs
error CS5001: Program `Ap_3.exe' does not contain a static `Main' method suitable for an entry point
Compilation failed: 1 error(s), 0 warnings
#
これは何が起きているのでしょうか。

54 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 04:24:16 ]
>>45
友人からバグがあるとの指摘を受けました。確かに。

'条件の選別'([],[],[],_) :- ! .
'条件の選別'([[A|_]|R1],[B|R2],[A = B|R],VL) :-
  \+(var(B)),
  '条件の選別'(R1,R2,R,VL),
  ! .
'条件の選別'([[A|_]|R1],[B|R2],[U2|R],VL) :-
  var(B),
  member(U,VL,VR),
  U =.. [Func,B1,B2],
  B==B1,
  関数変換(Func,A,B2,U2),
  '条件の選別'([[A|_]|R1],[B|R2],R,VR),
  ! .
'条件の選別'([_|R1],[_|R2],R,VL) :-
  '条件の選別'(R1,R2,R,VL) .

関数変換(@>=,A,B2,U2) :- U2=..[>=,A,B2],!.
関数変換(@=<,A,B2,U2) :- U2=..[<=,A,B2],!.
関数変換(=<,A,B2,U2) :- U2=..[<=,A,B2],!.
関数変換(Func,A,B2,U2) :- U2=..[Func,A,B2],!.
member(A,[A|R],R).
member(A,[_|R],R2) :- member(A,R,R2).

再帰の末尾の呼び出し方が間違ってました。一つの引数に対して
式が複数あることもありますから。
例: 締日>='20070901' and 締日<='20071031'


55 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 04:43:34 ]
これでもだめですね。うーん。・・・ 一引数増やして・・・
'条件の選別'(A,B,C,D) :- '条件の選別'(A,B,C,D,D).
で呼びます。
'条件の選別'([],[],[],_,_) :- ! .
'条件の選別'([[A|_]|R1],[B|R2],[A = B|R],VL,VL2) :-
\+(var(B)),
'条件の選別'(R1,R2,R,VL,VL),
! .
'条件の選別'([[A|_]|R1],[B|R2],[U2|R],VL,VL2) :-
var(B),
member(U,VL2,VR),
U =.. [Func,B1,B2],
B==B1,
関数変換(Func,A,B2,U2),
'条件の選別'([[A|_]|R1],[B|R2],R,VL,VR),
! .
'条件の選別'([_|R1],[_|R2],R,VL,_) :-
'条件の選別'(R1,R2,R,VL,VL) .

一引数増やして第4引数に変数情報リストの原型を持ち回ることにしました。
一度使った情報は使わないようにしたかったのですが、引数の順序に整順に
変数情報が現れるわけではないので。

56 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 04:51:17 ]
nbsp を入れ忘れましたね。すみません。第一引数か変化したときに
リストを原型に戻すという手法ですね。なお、引数は

_属性名リスト,_引数ならび,_解の収集欄,_変数情報リスト原型,_残りの変数情報リスト です。

57 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 05:29:34 ]
以下は典型的なプログラムパターン。
fooの第二引数に予め、findall/3で述語定義から情報を収集しておくことが多い。
第二、第三引数を省略して述語呼び出しとバックトラックでやろうとすると失敗する。

foo([],_,_,[]).
foo([A|R1],L,L2,[B|R2]) :-
  foo_2(L2,LR,A,B),
  foo([A|R1],L,LR,R2).
foo([_|R],L,_,X) :-
  foo(R,L,L,X).

foo_2(L,LR,A,B) :-
  member([A,B],L,LR).

58 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 06:07:24 ]
今回もバグの山、粗忽の見本となりました。Prologでまったり2で
随分ベテランらしいプログラマがエラーの連続とするということは、
Prologというのは余程不完全な言語らしい、との評もいただきました。
バグの山となるのは私の性格と能力によるものでこんなことで、
Prologの評価が下がるのは残念です。
私のスレへの書き込み環境はFirefoxの縦六行の<textarea>で全く読み返しを
しませんから(上にスクロールしたものも)ミスがでるのも仕方ないと
思っています。それどころか、Prologプログラミングの理想は
思考経路が陽に現れたものではないかとさえ思っています。誤謬も含めて、
そのプログラムを読んだ人が、ああ、この人はああ考え、こう考えて、
ここのコードを書いたのだなと解るコードこそ、論理プログラミングの
極致ではないか。コピペや参照を極力避けて、狭い窓の中での
即時的なミニマムな思考がPrologのプログラミングとして現れている、
そう人が感じてくれるコードを書きたいものです。
とんでもない、エラーや思い違いが貴重なこともあるのではないか。
このプログラミング言語が世に現れたちょうど同じ頃、サティの音楽が
街に溢れ始めました。



59 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 04:32:40 ]
あなたをベテランだと考えている人間はごく少数だと思われます。

60 名前:デフォルトの名無しさん [2007/11/23(金) 17:25:30 ]
w-zero3というwillcomの携帯(WS003SH)にswi-prologをインストールされた方もしいらっしゃれば、手順を詳しく教えていただけないでしょうか?

下のページを見ながら挑戦しているのですが、いくつかあるpl.exeどれをインストール・実行しても「有効なPocketPCアプリケーションではありません」と出て実行できないのです。
ttp://www.rainer-keuchel.de/wince/swi-prolog.html

また、swi-prolog以外で、windows mobile で実行できるprolog環境でおすすめのものがありましたら是非教えていただきたく思います。



61 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:59:43 ]
このためだけにwilcomの携帯を購入する訳にもいかないので、この話私はパス。

62 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:33:54 ]
>>61
固定つけてよ。NG登録するから。

63 名前:prolog mailto:sage [2007/11/25(日) 23:31:29 ]
こういう風にやればいいの?

64 名前:proIog mailto:sage [2007/11/26(月) 07:09:30 ]
つけてみた

65 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:21:04 ]
A「私は右から二番目。Bと隣り合わせ」
B「私の隣には嘘をついてない人がいる」
C「私は嘘をつかない人だから、妬まれて2人に挟まれてる」
D「私の左は悪い人、右は良い人」

ABCDのうち、2人が嘘つき。並んでる順番を求めなさい。

ってのを見て、Prologでやろうと思ったが書き方が分からん。



66 名前:デフォルトの名無しさん [2007/12/18(火) 17:58:46 ]
/*

# 一度で書き込めないので、前半

A「私は右から二番目。Bと隣り合わせ」
B「私の隣には嘘をついてない人がいる」
C「私は嘘をつかない人だから、妬まれて2人に挟まれてる」 ==> 妬む2人は嘘つきということと解しておく
D「私の左は悪い人、右は良い人」 ==> 悪い人=嘘つき、良い人=嘘をつかない人と解しておく

ABCDのうち、2人が嘘つき。並んでる順番を求めなさい。
*/

% 同値の定義
% 嘘つき(fail)の言っていることは嘘,
% 嘘をつかない人(true)が言っていることは真実
% 嘘つき(fail)か嘘をつかない人(true)か、とその言明は同値

eqvalue(X,Y):- X , Y.
eqvalue(X,Y):- \+ X , \+ Y.

% すべての並び順を生成
map(Seed,A,B,C,D):- select(Seed,A,AR),select(AR,B,BR),select(BR,C,[D]).

select([A|L],A,L).
select([A|L],B,[A|R]):-select(L,B,R).

% リストの要素
member(A,[A|_]).
member(A,[_|L]):-member(A,L).

67 名前:デフォルトの名無しさん [2007/12/18(火) 17:59:51 ]
% 後半、タブが詰まってしまい、見づらいが。

go:-
OrderMap=[('A',AOrder,ATF),('B',BOrder,BTF),('C',COrder,CTF),('D',DOrder,DTF)], % 名前、並び順、嘘つきかどうかなど組み合わせ表
setof([A,B,C,D],map([true,true,fail,fail],A,B,C,D),L),
member([ATF,BTF,CTF,DTF],L), % A,B,C,Dの嘘つき・嘘をつかないの組み合わせを順次生成
map([1,2,3,4],AOrder,BOrder,COrder,DOrder), % A,B,C,Dの順序の組を順次生成
% 以下、各人の言明を検証する
eqvalue(ATF,(AOrder is 3,(BOrder is AOrder-1;BOrder is AOrder+1)) ), % Aは三番目(右から二番)Bは隣
eqvalue(BTF,((NextB is BOrder-1,NextB>0; NextB is BOrder+1,NextB<5), % Bの隣、前か後ろで1以上5未満の位置
member((_,NextB,true),OrderMap)) ), % Bの隣は嘘をつかない人
eqvalue(CTF,(CTF, % Cは嘘をつかない人
member(COrder,[2,3]),BeforeC is COrder -1,AfterC is COrder+1, % Cは左右に人が配置できる位置
member((_,BeforeC,fail),OrderMap),member((_,AfterC,fail),OrderMap)) ), % 左右とも嘘つき
eqvalue(DTF,(member(DOrder,[2,3]),BeforeD is DOrder -1,AfterD is DOrder+1, % Dは左右に人が配置できる位置
member((_,BeforeD,fail),OrderMap),member((_,AfterD,true),OrderMap)) ), % 左嘘つき,右嘘つきでない
write(OrderMap),nl,fail. % 結果表示。全解を求めるためにfailさせる

/*

| ?-go.
[(A,1,fail),(B,3,true),(C,4,fail),(D,2,true)]
[(A,1,fail),(B,4,true),(C,2,fail),(D,3,true)]
[(A,2,fail),(B,4,true),(C,1,fail),(D,3,true)]
[(A,4,fail),(B,3,true),(C,1,fail),(D,2,true)]
[(A,3,true),(B,2,true),(C,1,fail),(D,4,fail)]
[(A,3,true),(B,2,true),(C,4,fail),(D,1,fail)]
[(A,3,true),(B,4,true),(C,2,fail),(D,1,fail)]
no

*/

68 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:38:15 ]
保守。

69 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:58:06 ]
Prologを使ってる方がいらっしゃるようなのでお聞きしたいのですが、
処理系によってはギガバイトクラスのデータに対しても使えるのでしょうか?

70 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:30:14 ]
これ凄い。
ttp://edoc.bib.ucl.ac.be:81/ETD-db/collection/available/BelnUcetd-12032007-095411/unrestricted/thesis.pdf
3月下旬に本も出た?
ttp://www.amazon.co.jp/Towards-Putting-Abstract-Interpretation-Practice/dp/3836488582/ref=sr_1_3?ie=UTF8&s=english-books&qid=1207570620
INAPを見てもヨーロッパからの学術論文は続々。日本、本当に大丈夫なのか。



71 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 01:01:25 ]
             __t─-v-─ァ__
            <:::::::::::::::::::::::::::::::>
          <´:::z-r─--v、:::::::::>
           く:::::{  |    }ハ::}:::::〉
      ,...:::' ̄ヾ<::::i  ィ=z  z=く 〉:::>
   ,...::::´::::::::::::::::::V:::レ´ !       `!::/
  /:::::::::::::::::::::::::::::::}rj ≡≡   ≡≡|<
. 〈:::::::::::::::::::::::::_::z-┤ u '''  i   '' |ノ
  ヽ:::::::::::::::::ス_r- 、`¨l、  、__   ノ   マイナーですから
   ヽ:::::::::::::::::::ヾ:::::`ー-{ヽー--‐ イ_..:-─::.、
    \:::::::::::::::::::::::::::::::::ヽ-{チ-<::::::::::::::::l
     \:::::::::::::::::::\:::::::::::|o::::::::::::::::::::::l::l
       \::::::::::::::::::ヽ::::::::|::::::::::::::::::::::::l::l
.          入::::::::::::::::::::::::::|:::::::::::::::::::::::l:〈


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