5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

PrologでまったりPart 2

1 :デフォルトの名無しさん:04/12/10 16:37:01
Prologについてまったりと語るスレです。

過去スレ
Prolog でまったり
http://pc5.2ch.net/test/read.cgi/tech/976462999/

リンク集
http://www.summa.jp/lang/logic/prolog.htm
http://bach.istc.kobe-u.ac.jp/prolog/

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


2 :デフォルトの名無しさん:04/12/10 16:44:50
2

3 :デフォルトの名無しさん:04/12/10 19:37:52
こんにちは。
SWI-Prolog version 5.2.13 for i386-freebsd5.0を使ってます。

foreign_t
pl_d (term_t t)
{

PL_unify_atom_chars (t, "hoge");

PL_succeed;
}

xx :-
thread_create(d(X), Id,[]),
thread_join(Id, Exit),
print(X).

?- dx.
_G186

Yes

となります。dでXをユニファイしてprintでXの値を表示したいの
ですが、方法がありますか?


4 :デフォルトの名無しさん:04/12/10 19:40:59
         ヘ  o ,    ── /   __,   /  _,   /_/_/       __,   /
          /  \ ´   ── /        /   ─'  /    _       / 
         _/    \   __ /   ___/   ___/     /   ___/
                                     ̄ ̄ ̄
                    _ , ― 、
                  ,−'  `      ̄ヽ_
                 ,'            ヽ
                (   `ー'ー'ヽ`ー'ー'ヽ  )        
               (  ノ ''''''   '''''':::::::ヽ  )
               ( . )(●),   、(●)、.:( ) +
               ( )   ,,ノ(、_, )ヽ、,, .::::( )    <ヨン様が華麗に4get!
               . ヽ )   `-=ニ=- ' .:::::::|ノ  +
                  \  `ニニ´  .:::::/      +
               ,,.....イ.ヽヽ、ニ__ ーーノ゙-、.
               :   |  '; \_____ ノ.| ヽ i














5 :デフォルトの名無しさん:04/12/10 19:41:16
?- dx. -> ?- xx.
でした。

6 :デフォルトの名無しさん:04/12/10 23:32:43
はずかしくないんですか?

7 :デフォルトの名無しさん:04/12/10 23:33:50
なにがですか

8 :デフォルトの名無しさん:04/12/11 05:29:02
>>3
なんでthreadを使っているのかわからんが、thread_joinとprintの順序を入れ替えてみたら?

9 :デフォルトの名無しさん:04/12/13 16:37:34
SWI-Prologで変数に漢字を使用する方法はあるのですか。
_漢字コード = 'EUC'. のように。


10 :デフォルトの名無しさん:04/12/14 02:08:26
>>8
thread_createに渡した述語がunifyしたら反映されるか知りたかっただけです。
Prologエンジンが起こされて、独自のスタックを持つからダメなんですね。

11 :デフォルトの名無しさん:04/12/15 17:35:25
9 に質問を書いたものです。
SWI-Prologのソースを見るとpl-read.c の中にcheckASCII()と
いう関数があります。これを常に真になるようにして、
コンパイルするだけでよいのでしょうか。


12 :デフォルトの名無しさん:04/12/15 17:40:37
そう思ったらやってみろよ。


13 :デフォルトの名無しさん:04/12/15 18:11:40
やってみたところ、インタプリタのトップレベルではうまくいきましたが、
肝心の ?- read(X)で '社員'(_氏名). や 
?- assertz(('基本給'(_年齢,_給与) :- _年齢 > 62, '定年後給与'(_年齢,_給与))).

はうまく行かないようです。pl-read.cを直したのでread(X)の方は
うまくいくかと思ったのですが・・・。



14 :デフォルトの名無しさん:04/12/15 18:56:05
たびたびすみません。実行ファイルを間違えていました。
上の二つとも上手くいきました。


15 :デフォルトの名無しさん:04/12/25 09:12:09
> 13-14 自己(訂正)レス。最終的に、
書き換えたのはpl-type.c の _PL_char_types[]という文字テーブルと
initCharTypes() というそのテーブルの初期化関数だけです。



16 :デフォルトの名無しさん:04/12/25 09:23:49
>15 pl-ctype.c の間違いでした。

17 :デフォルトの名無しさん:04/12/28 15:27:26
独学でPrologを勉強している者です。
練習問題に解答が載っていないので困っています。

Convert the following information into a Prolog program:

Everyone born in Australia is an Australian citizen.
オーストラリアに生まれた者はみなオーストラリアの国民だ
Children of Australian citizens are Australian citizens.
オーストラリアの国民の子供はオーストラリアの国民だ
Peter is John's father and was born in New Zealand.
ピーターはジョンのお父さんで、ニュージーランドで生まれた
Mary is John's mother and was born in Australia.
メアリーはジョンのお母さんで、オーストラリアで生まれた

他の例題見ながら自分で考えてみたんですが

citizen(X) :- born(X, Y), australia(Y).
citizen(X) :- child(born(X, Y), australia(Y)).
new_zealand(father(peter, john)).
australia(mother(mary, john)).

JohnがMaryやPeterのchildであると示す方法が分かりません。
というか上ので大方合っていますか?
全然分からないので手助けお願いします。m(__)m

18 :デフォルトの名無しさん:04/12/28 16:56:25
/* 最終行から */
:- op(700,xfy,は).
:- op(700,xfy,の).
:- op(700,xfy,で).
メアリー は ジョン の お母さん で オーストラリア で 生まれた.

/* 上は冗談 第一行目は */
citizen(X,australia) :- born(X,australia). /* でしょう */


19 :デフォルトの名無しさん:04/12/28 17:51:50
ありがとうございます。(上の冗談がちょっと分からないですが(^^ゞ)

そのヒントを基に考えてみたのですが・・・

citizen(X,australia) :- born(X,australia).
citizen(X,australia) :- child_of(Y,citizen(X,australia)).
child_of(john,peter).
child_of(john,mary).
born(peter, new_zealand)).
born(mary, australia)).

第二行目の左辺と右辺で同じatomic formula(=citizen(X,australia))が出てきていますので
無限ループみたいになってしまうのでしょうか。
以下のような警告が出ます:
% Scanning references for 1 possibly undefined predicates
Warning: The predicates below are not defined. If these are defined
Warning: at runtime using assert/1, use :- dynamic Name/Arity.
Warning:
Warning: citizen/2, which is referenced by
Warning: 1-st clause of child_of/2
Warning: 1-st clause of born/2

どうしたらよいのでしょう?

20 :デフォルトの名無しさん:04/12/28 17:55:54
citizenってのは述語だから値を返すとするなら真理値を返すんだろ。
真理値の子供Yはオーストラリア国民であるってのは変だろ?


21 :デフォルトの名無しさん:04/12/28 18:10:51
ということは第二行目は

citizen(X,australia) :- child_of(Y,X).

でしょうか?一つ警告が消えました。

% Scanning references for 1 possibly undefined predicates
Warning: The predicates below are not defined. If these are defined
Warning: at runtime using assert/1, use :- dynamic Name/Arity.
Warning:
Warning: born/2, which is referenced by
Warning: 1-st clause of citizen/2

もしくはこれはどうでしょう?

citizen(X, australia) :- child_of(Y, Z), citizen(Z, australia).

・・・上とまったく同じ警告が出ます・・・なぜでしょう?

22 :デフォルトの名無しさん:04/12/28 18:22:56
あ゛ーーっ!!
すみません、さっき第五行目と第六行目に一つずつ括弧が多かったです。

citizen(X, australia) :- born(X, australia).
citizen(X, australia) :- child_of(Y, X), citizen(X, australia).
child_of(john, peter).
child_of(john, mary).
born(peter, new_zealand).
born(mary, australia).

で今は正常に動いているように見えるんですが・・・
2 ?- citizen(john, australia).

No ←!?
3 ?- citizen(mary, australia).

Yes
4 ?- citizen(peter, australia).
ERROR: Out of local stack
・・・えっ、JohnはCitizenですよね?お父さんは違うでしょうけど。
どうでしょうか・・・

23 :デフォルトの名無しさん:04/12/28 18:23:06
警告読め。


24 :デフォルトの名無しさん:04/12/28 18:34:54
それがSingleton意外の警告はすべて消えてしまいました。

% Waiting for editor ...
% Running make to reload modified files
Warning: (c:/documents and settings/john petrucci/my documents/prolog/australian.pl:2):
Singleton variables: [Y]
% c:/documents and settings/xxxxxxx/my documents/prolog/australian.pl compiled 0.00 sec, 0 bytes

問い合わせるとこんな感じです:

21 ?- citizen(john,australia).
No
22 ?- citizen(mary,australia).
Yes
23 ?- citizen(peter,australia).
ERROR: Out of local stack
24 ?- born(peter,australia).
No
25 ?- born(peter,new_zealand).
Yes
26 ?- born(mary,australia).
Yes

PeterがCitizenかと訊いたら何故Noと答えずにErrorが出るんでしょうね・・・

25 :デフォルトの名無しさん:04/12/28 18:38:55
釣りか? 当たり前だろ。
> citizen(X, australia) :- child_of(Y, X), citizen(X, australia).


26 :デフォルトの名無しさん:04/12/28 18:44:32
http://game10.2ch.net/test/read.cgi/game/1104208080/l100
このスレ荒らしてあげて下さい。
ウイルス貼りまくっていいですよ。
歓迎します。

27 :デフォルトの名無しさん:04/12/28 18:45:13
あ゛ーーーーっ!
分かりました。
そりゃそうですよね。すみません。Yでした。釣りじゃないです。

citizen(X, australia) :- born(X, australia).
citizen(Y, australia) :- child_of(Y, X), citizen(X, australia).
child_of(john, peter).
child_of(john, mary).
born(peter, new_zealand).
born(mary, australia).

33 ?- citizen(john,australia).

Yes
34 ?- citizen(mary,australia).

Yes
35 ?- citizen(peter,australia).

No

完成です! ありがとうございました!!!

28 :デフォルトの名無しさん:04/12/28 18:47:43
おめ。


29 :デフォルトの名無しさん:04/12/29 21:14:13
John likes all kinds of food.
ジョンは食べ物なら何でも好き。
Apples are food. Oysters are food.
林檎は食べ物。牡蠣も食べ物。
Anything anyone eats and still alive is food.
食べれるもので生きているものは何でも食べ物。
Tom eats snakes and still alive.
トムは蛇を食べるし、蛇は生きている。
Sue eats everything Tom eats.
スーはトムが食べるものは何でも食べる。

likes(john,X) :- food(X).
food(apples).
food(oysters).
food(X) :- eats(Y,X), alive(X).
eats(tom,snakes).
alive(snakes).
eats(sue,X) :- eats(tom,X).

他は合っていると思うんですが
最後のeats(sue,X) :- eats(tom,X).だけうまくいっていません。続く。

30 :デフォルトの名無しさん:04/12/29 21:15:07
問い合わせた結果:

19 ?- likes(john,snakes).
Yes
20 ?- eats(sue,snakes).
No ←!?
21 ?- eats(tom,snakes).
Yes
22 ?- food(X).
X = apples ;
X = oysters ;
X = snakes ;
No

トムが蛇を食べるんだからスーも食べますよね?
なぜスーは食べないんでせう?

31 :デフォルトの名無しさん:04/12/29 22:40:43
昨日の続きかな?

>>29
> Anything anyone eats and still alive is food.
> 食べれるもので生きているものは何でも食べ物。

違う。それを食っても生きていられりゃそれは食い物だ。


32 :デフォルトの名無しさん:04/12/30 00:55:35
>30 Noになるとは考えられない。
最後の節 eats(sue,X) :- eats(tom,X). は
本当にassertされているだろうか。


33 :デフォルトの名無しさん:04/12/30 04:36:55
>>30
SWI-Prologでやったら、ちゃんとスーが蛇をたべたよ。
関係ないかもしれないけど、eatsの定義が分離しているから、くっつけてみたら?

34 :デフォルトの名無しさん:04/12/30 04:44:55
Prologやってる人ってどんなプログラム書いてる
んですか?やっぱパズルの解法プログラムとか
そういう用途ですか?

35 :デフォルトの名無しさん:04/12/30 05:23:00
>>34
うん、ズバリその通り。
コードを一般の手続き型言語よりもスマートに記述できたときは、無茶苦茶感動するんだな、これが。

36 :30:04/12/30 06:16:01
>>31
はい、昨日の続きです。
英語の間違いまで指摘してくださってありがとうございます。
その指摘通りに直してみました。

likes(john,X) :- food(X).
food(apples).
food(oysters).
food(X) :- eats(Y,X), alive(Y).
eats(tom,snakes).
alive(tom).
eats(sue,X) :- eats(tom,X).

すると、スーも蛇食べました。(~o~)

7 ?- food(X).
X = apples ;
X = oysters ;
X = snakes ;
No
8 ?- eats(sue,X).
X = snakes ;
No
9 ?- eats(sue,snakes).
Yes
10 ?- eats(tom,snakes).
Yes

37 :30:04/12/30 06:16:45
>>32
ありがとうございます。
あれ、もう一度、元に戻してみたらスーは蛇を食べました。
読み込めてなかったんでせうか・・・。

>>33
ありがとうございます。
私のもSWI-Prologです。
eatsの定義をひっつけるというのはどうやるのでしょうか?
下のようにしたら蛇を食べ物として認識しなくなりました。

likes(john,X) :- food(X).
food(apples).
food(oysters).
food(X) :- eats(Y,X), alive(Y).
eats(tom,snakes), alive(tom). ←ひっつけました。
eats(sue,X) :- eats(tom,X).

4 ?- food(X).
X = apples ;
X = oysters ;
No

38 :デフォルトの名無しさん:04/12/30 07:49:00
>34 私の会社では、16年間事務処理(販売管理、給与、財務)は
全てPrologで書かれたプログラムによって運用されています。
現在使っているのコードの過半は16年前に書かれたものです。
インタプリタをTelnetで使用してきましたが、7年前からWeb経由でも
使用しています。ちょっとだけトップレベルのlogを見せましょう。
/* 2004/12/29 9:55:16 */ ?- 12/24+60160+1392870.
/* 2004/12/29 9:55:22 */ ?- 12/24+60293+37800.
/* 2004/12/29 9:55:37 */ ?- 60400++12/27+952+['10000L']+321000.
/* 2004/12/29 10:16:46 */ ?- 2 :: 回収表発行(本部,'20041220').
/* 2004/12/29 10:18:12 */ ?- 2 :: 回収表発行(東京営業所,'20041220').
/* 2004/12/29 10:22:42 */ ?- 12/29+17392+328230.
エッ、コレガ Prolog? っていう感じですね。


39 :デフォルトの名無しさん:04/12/30 10:06:07
補足説明。例えば、 ?- 12/24+60160+1392870. が呼び出す述語の定義節は
A / B + C + D :- insert into 売上 values (A,B,C,D).

実際にはデータベースの列数はもっと多く、ここまで単純ではありませんが、
このような入力パターンが売上伝票の種類分だけ定義されていると思って
ください。簡単でしょう。
"/" や "+" のようなオペレータの位置によってインタプリタがパターンを
判断しています。
>18 で冗談としたのものは、このようなプログラミングの可能性を仄かに
見せたかったのです。


40 :30:04/12/30 14:41:17
えーっ、事務処理用のプログラムをPrologで、ですか。
なぜCOBOLやCではなかったのか気になります。
それと>>18の冗談がようやく分かりました。
は、の、で、は文節を分けるための区切り文字だったんですね。
(私も前々学期に簡単なインタプリタをCで作りましたので少し分かります。)
私の夢はPrologでエキスパート・システムと自然言語処理をすることです。
この本では第九章と第十章に載っています。
でも私は今第一章を読み終わったところです。これからまた読みまする・・・。

41 :デフォルトの名無しさん:04/12/30 15:32:38
>40 事務処理とは企業の活動を記録することです。未来を語ることも
含みます。このような対象のプログラミングには記号処理言語が最も
ふさわしいのではないかと考えました。
記号処理言語の中でも何故Prologを採用したかですが、我々は最終的に
自然言語でのプログラミングを目指しているという仮説のもとに、
その時点での、すなわち約20年ほど前ですが、次善のものを論理式に
求めました。このような観点からプログラム言語を選択すると
当時の流行でもあり、Prolog以外に考えられなかったのです。





42 :デフォルトの名無しさん:04/12/30 15:53:55
>37 eats(tom,snakes),alive. これはホーン節ではありません。
syntax errorになっている筈です。 >33 で云われているくっつけるとは
eats(tom,snakes).
eats(john,X) :- eats(tom,X). のように間に他の定義節を入れないことでしょう。

ただ私がSWI-prologで確かめたところ、これが原因ではないようです。



43 :30:05/01/01 16:54:14
あめましておけでとうございます。(^^)
今年もよろしく。

>>41
今までの記録から未来の傾向を予測するということですか。
そんなことを20年くらい前に考えていたんですね。
そうそう、このPrologの本にも1981年の
日本でのFifth Generation Computer Project (or Systems)について少し書かれてます。
これを契機にPrologが世界に知れ渡ったんですよね。
日本が世界に与える影響って大きいんだなぁ、と思いました。誇りに思います。

>>42
はい、私の方でもそのようにくっつけてみましたがうまくいきませんでした。
でも、不器用ですが>>36でなんとか動いたので一応よしとします。
ありがとうございました!

44 :デフォルトの名無しさん:05/01/05 12:40:02
またまた、お世話になります。
The Pizza-House chalkboard that lists various types of pizza with their ingredients and prices
was wiped out by the rain. You are asked to rewrite the board using the following information.
There are five types of pizza with completely different toppings and prices. Each type of pizza has two toppings:
one from the list of ham, mussels, prawns, salami, and tuna;
the other from the list of avocado, corn, olive, pineaplle, and tomato.
Five prices are $5.00, $6.50, $7.00, $8.50, and $10.00. Other clues are given below.

Hawaiian pizza has mussels and costs over $6.50. Marco-Polo has tomato, but no ham,
which is on the pizza that costs $8.50. Pepperoni costs $7.00 and Super-Supreme has no pineapple.
The price of the pizza that has tuna and corn is not $6.50, and the pizza that costs $5.00 has olive but no salami.
The price of the pizza that has pineapple is not $10.00. The last type of pizza is called Ninja pizza.
You need to determine which pizzas have what toppings and prices.

45 :デフォルトの名無しさん:05/01/05 12:40:25
ピザ屋の黒板が雨に濡れて一部消えたそうです。
それを書き直すのが今回の仕事です。
トッピングと値段が完全に異なる5種類のピザがあります。
それぞれのピザには2種類のトッピングが載っています。
一種類目は肉類でham, mussels, prawns, salami, tunaです。
もう一種類は野菜類でavocado, corn, olive, pineapple, tomatoです。
値段は$5.00, $6.50, $7.00, $8.50, $10.00です。

Hawaiian pizzaはmusselsが載っており値段は$6.50よりも高いです。
Marco-Polo pizzaはtomatoが載ってますがhamは載っていません、
そして値段は$8.50です。
Pepperoni pizzaの値段は$7.00です。
Super-Supremeにはpineappleは載っていません。
tunaとcornが載っているピザの値段は$6.50ではありません。
$5.00のピザにはoliveが載っていますがsalamiは載っていません。
pineappleが載っているピザの値段は$10.00ではありません。
そしてNinja pizzaと呼ばれるピザもあります。
・・・これでどのピザにどのトッピングが載っていていくらかを見つけなければなりません。

46 :デフォルトの名無しさん:05/01/05 12:42:27
例題を見ながら組んでみました。ちなみに'\='は"ではない(=is not)"と読みます。
pizza_solution(S) :-
types(S),meats(M),vegetables(V),prices(P),
entry((pepperoni,_,_,7.00),S),
entry((ninja,_,_,_),S),
associate(S,M,V,P),
entry((hawaiian,mussels,_,PH),S),
PH > 6.50,
entry((marco_polo,MM,tomato,8.50),S),
MM \= ham,
entry((super_supreme,_,VS,_),S),
VS \= pineapple,
entry((_,tuna,corn,PS1),S),
PS1 \= 6.50,
entry((_,MS2,olive,5.00),S),
MS2 \= salami,
entry((_,_,pineapple,PS3),S),
PS3 \= 10.00.

associate([],[],[],[]).
associate([(Name,M,V,P)|Rest],Ms,Vs,Ps) :-
select(M,Ms,RMs),
select(V,Vs,RVs),
select(P,Ps,RPs),
associate(Rest,RMs,RVs,RPs).

47 :デフォルトの名無しさん:05/01/05 12:43:50
エキスパートシステムはもう古い。海外の状況がわかっていないようだな

48 :デフォルトの名無しさん:05/01/05 12:44:43
select(X,[X|R],R).
select(X,[Y|R],[Y|S]) :- select(X,R,S).

entry(X,[X|R]).
entry(X,[Y|R]) :- entry(X,R).

types([(hawaiian,MH,VH,PH),
(marco_polo,MM,VM,PM),
(pepperoni,MP,VP,PP),
(super_supreme,MS,VS,PS),
(ninja,MN,VN,PN)]).

meats([ham,mussels,prawns,salami,tuna]).
vegetables([avocado,corn,olive,pineapple,tomato]).
prices([5.00,6.50,7.00,8.50,10.00]).

・・・動くのですが、3パターンの答えが返ってきます。
3 ?- pizza_solution(S).
S = [ (hawaiian, mussels, avocado, 10.0), (marco_polo, prawns, tomato, 8.5), (pepperoni, tuna, corn, 7.0), (super_supreme, ham, olive, 5.0), (ninja, salami, pineapple, 6.5)] ;
S = [ (hawaiian, mussels, avocado, 10.0), (marco_polo, salami, tomato, 8.5), (pepperoni, tuna, corn, 7.0), (super_supreme, ham, olive, 5.0), (ninja, prawns, pineapple, 6.5)] ;
S = [ (hawaiian, mussels, avocado, 10.0), (marco_polo, salami, tomato, 8.5), (pepperoni, tuna, corn, 7.0), (super_supreme, prawns, olive, 5.0), (ninja, ham, pineapple, 6.5)] ;
No

二つ目のsuper_supremeは「$5.00のピザにはoliveが載っていますがsalamiは載っていません。」
のルールに反しています。ちゃんと
entry((_,MS2,olive,5.00),S), MS2 \= salami,
って書いてるんですけどね・・・。
何がどう間違っているんでしょうか?教えてください。m(__)m

49 :デフォルトの名無しさん:05/01/05 14:19:09
>3 ?- pizza_solution(S).
>S = [ (hawaiian, mussels, avocado, 10.0), (marco_polo, prawns, tomato, 8.5), (pepperoni, tuna, corn, 7.0), (super_supreme, ham, olive, 5.0), (ninja, salami, pineapple, 6.5)] ;
>S = [ (hawaiian, mussels, avocado, 10.0), (marco_polo, salami, tomato, 8.5), (pepperoni, tuna, corn, 7.0), (super_supreme, ham, olive, 5.0), (ninja, prawns, pineapple, 6.5)] ;
>S = [ (hawaiian, mussels, avocado, 10.0), (marco_polo, salami, tomato, 8.5), (pepperoni, tuna, corn, 7.0), (super_supreme, prawns, olive, 5.0), (ninja, ham, pineapple, 6.5)] ;
>No
>
>二つ目のsuper_supremeは「$5.00のピザにはoliveが載っていますがsalamiは載っていません。」
>のルールに反しています。ちゃんと
>entry((_,MS2,olive,5.00),S), MS2 \= salami,
>って書いてるんですけどね・・・。
>何がどう間違っているんでしょうか?教えてください。m(__)m
(_, salami, olive, 5.0) の組み合わせの解はどこにも見当たりませんが・・・。


50 :デフォルトの名無しさん:05/01/05 15:21:33
英文の通りに書いたらちゃんと1通りだけ出てきたよ。


51 :44:05/01/05 15:28:01
ありがとうございます。
あっ、本当ですね。(汗
すみません、私の脳内でhamとsalamiを同一視してしまっていたようです。
(少し似てますよね・・・全然似てませんか _| ̄|○)

ということで今は他の原因を探しています・・・。

52 :44:05/01/05 15:48:39
ええーっ、(やっぱり)そうですか。(汗汗
上記の3パターンの中に正解はありますか?

考察すると
まだ肉類が決まっていないのはmarco_polo、super_supreme、ninjaです。
表にするとこうです:

marco_polop s s
super_supremeh h p
ninjas p h

※それぞれp = prawns, s = salami, h = hamです。

ninjaは何も定義がないので、その三種類どれでもいいです。
marco_poloはhamを受け付けません。
同様にsuper_supremeはsalamiを受け付けません。
prawnsが何か定義されてれば分かるんですが・・・。

ちなみにmusselsは定義でしっかりHawaiian,
tunaはcornとセットで$6.50ではない、という皺寄せで決まったものと思われます。

何故でせう?
何か忘れている定義はありますか?

53 :デフォルトの名無しさん:05/01/05 15:53:53
>>52
> ええーっ、(やっぱり)そうですか。(汗汗
> 上記の3パターンの中に正解はありますか?

ないねー。

> 何故でせう?
> 何か忘れている定義はありますか?

条件の読み違い。
私のソース貼ってもいいよ。


54 :44:05/01/05 16:00:26
>>53
>ないねー。
ええーっ!(予想していたにもかかわらず、がっくし・・・)

>私のソース貼ってもいいよ。
是非お願いします。<m(__)m>

55 :デフォルトの名無しさん:05/01/05 16:13:44
んじゃ、貼りますね。

pizza_types([hawaiian,marco_polo,pepperoni,super_supreme,ninja]).
pizza_meats([ham,mussels,prawns,salami,tuna]).
pizza_vegitables([avocado,corn,olive,pineapple,tomato]).
pizza_prices([5.00,6.50,7.00,8.50,10.00]).

select(X,[X|R],R).
select(X,[Y|R],[Y|S]) :- select(X,R,S).
select_in_order(X,[X|R],R).
associate([],[],[],[],[]).
associate([(T,M,V,P)|R],Types,Meats,Vegitables,Prices) :-
select_in_order(T,Types,RTypes),
select(M,Meats,RMeats),
select(V,Vegitables,RVegitables),
select(P,Prices,RPrices),
associate(R,RTypes,RMeats,RVegitables,RPrices).


56 :デフォルトの名無しさん:05/01/05 16:15:09
つづき。

pizza_combinations(S) :-
member((hawaiian,mussels,_,Price1),S),Price1 > 6.50,
member((marco_polo,Meat2,tomato,_),S),Meat2 \= ham,
member((_,ham,_,8.50),S),
member((pepperoni,_,_,7.00),S),
member((super_supreme,_,Vegitable3,_),S),Vegitable3 \= pineapple,
member((_,tuna,corn,Price4),S),Price4 \= 6.50,
member((_,Meat5,olive,5.00),S),Meat5 \= salami,
member((_,_,pineapple,Price6),S),Price6 \= 10.00.

pizza_solution(S) :-
pizza_types(Types), pizza_meats(Meats), pizza_vegitables(Vegitables),
pizza_prices(Prices),
associate(S,Types,Meats,Vegitables,Prices),
pizza_combinations(S).

先月末にこのスレ見たときはswi-prologの使い方さえ忘れてて
プロンプトの前でしばらく途方に暮れたくらいなんですが
このところ久しぶりに思い出せて楽しいです。


57 :デフォルトの名無しさん:05/01/05 16:17:46
しまったー、s/vegitable/vegetable/ して下さい。お恥ずかしい。


58 :44:05/01/05 16:35:58
ありがとうございます。
文を読んですんなりと組めるんですか・・・すごいです。
私は既存の例題の変数などを変えて組んでます、とほほ。

私も最初に組んだときはvegitableとタイプしました。
一応変えておきました。

それはそうと、結果はこうなりました:

S = [ (hawaiian, mussels, avocado, 10.0), (marco_polo, salami, tomato, 6.5), (pepperoni, tuna, corn, 7.0), (super_supreme, prawns, olive, 5.0), (ninja, ham, pineapple, 8.5)] ;
No

ピザの種類、肉類、野菜類の順番は私の解の三番目と一緒ですね。
ただ、marco_poloとninjaの値段が逆になっています。
marco_poloは定義では$8.50になっていると思ったんですがどうでしょうか?

59 :44:05/01/05 16:43:20
ああーっ!

60 :44:05/01/05 16:47:11
Marco-Polo has tomato, but no ham, which is on the pizza that costs $8.50.



Marco-Polo pizzaにはtomatoが載ってますがhamは載っていません。
そして、hamが載っているピザの値段は$8.50です。

と訳すんですね。なるほど、納得です。
しまった…また英語の問題で躓いてしまいました。
それを踏まえて自分のプログラムも直してみます。
しばらくお待ち下さい。m(__)m

61 :44:05/01/05 16:57:15
修正すると1通りだけの結果が出ました!

4 ?- pizza_solution(S).
S = [ (hawaiian, mussels, avocado, 10.0), (marco_polo, salami, tomato, 6.5), (pepperoni, tuna, corn, 7.0), (super_supreme, prawns, olive, 5.0), (ninja, ham, pineapple, 8.5)] ;
No

「また」英文が読めてなかったんですね、私・・・。
何年英語勉強してんだ、って話になります・・・反省。
以下が完成品になります。(長いので次レスです)
ご指摘がなかったら一生迷っていたことでしょう、いや本当に。
助かりました。ありがとうございました!!!

62 :44:05/01/05 16:57:43
pizza_solution(S) :-
types(S),
meats(M),
vegetables(V),
prices(P),
entry((pepperoni,_,_,7.00),S),
entry((ninja,_,_,_),S),
entry((_,ham,_,8.50),S), %←追加
associate(S,M,V,P),
entry((hawaiian,mussels,_,PH),S),
PH > 6.50,
entry((marco_polo,MM,tomato,_),S), %←修正
MM \= ham,
entry((super_supreme,_,VS,_),S),
VS \= pineapple,
entry((_,tuna,corn,PS1),S),
PS1 \= 6.50,
entry((_,MS2,olive,5.00),S),
MS2 \= salami,
entry((_,_,pineapple,PS3),S),
PS3 \= 10.00.

63 :44:05/01/05 16:58:05
associate([],[],[],[]).
associate([(Name,M,V,P)|Rest],Ms,Vs,Ps) :-
select(M,Ms,RMs),
select(V,Vs,RVs),
select(P,Ps,RPs),
associate(Rest,RMs,RVs,RPs).

select(X,[X|R],R).
select(X,[Y|R],[Y|S]) :- select(X,R,S).

entry(X,[X|R]).
entry(X,[Y|R]) :- entry(X,R).

types([(hawaiian,MH,VH,PH),
(marco_polo,MM,VM,PM),
(pepperoni,MP,VP,PP),
(super_supreme,MS,VS,PS),
(ninja,MN,VN,PN)]).

meats([ham,mussels,prawns,salami,tuna]).
vegetables([avocado,corn,olive,pineapple,tomato]).
prices([5.00,6.50,7.00,8.50,10.00]).

64 :デフォルトの名無しさん:05/01/05 18:57:10
おめ。
ところで>>55,56の私のプログラムですが、
あらゆる組合せを無条件に生成してから最後にチェックしているので遅いですね。
そこで、組合せのわかっている部分を取り出して始点にすれば探索空間を絞れます。

--- pizza.pl.old Wed Jan 5 18:33:38 2005
+++ pizza.pl Wed Jan 5 18:34:36 2005
@@ -14,6 +14,8 @@
select(P,Prices,RPrices),
associate(R,RTypes,RMeats,RVegetables,RPrices).

+pizza_menu([(hawaiian,mussels,_,_),(marco_polo,_,tomato,_),(pepperoni,_,_,7.00),(super_supreme,_,_,_),(ninja,_,_,_)]).
+
pizza_combinations(S) :-
member((hawaiian,mussels,_,Price1),S),Price1 > 6.50,
member((marco_polo,Meat2,tomato,_),S),Meat2 \= ham,
@@ -27,5 +29,6 @@
pizza_solution(S) :-
pizza_types(Types), pizza_meats(Meats), pizza_vegetables(Vegetables),
pizza_prices(Prices),
+ pizza_menu(S),
associate(S,Types,Meats,Vegetables,Prices),
pizza_combinations(S).

あとはもはや冗長となったtypesの扱いを削ることができ、
そうすれば44さんのプログラムとほぼ同じ形になりますね。ふむ。


65 :デフォルトの名無しさん:05/01/05 19:28:46
44さんの使っているprologの本の題名はなんていうの?

66 :デフォルトの名無しさん:05/01/06 04:58:49
>>47
現在の趨勢はどうなっているのでしょうか?
是非ご教授ください。

67 :Amalog ◆6l0Hq6/z.w :05/01/06 05:20:01
>>44です。あまりに頻出するのでトリップつけます。w

>>64
短くて分かりやすくていいですね。特に変数が読みやすくていいです。
(私のプログラムが如何にやっつけ仕事だったか、というのを思い知らされます(>_<))

>>65
本のタイトルは
Techniques of Prolog Programming
- with Implementation of Logical Negation and Quantified Goals -です。
著者はT. Van Leで1993年にJohn Wiley & Sons. Incから出版されています。
下のURLに詳しく書かれています。

ttp://books.kelkoo.co.uk/b/a/cpc_5101_ps_6184428_gs_16272291.html

改訂版が出てないところを見るとあんまり売れなかったのかも…Top Listにも載ってないし。
でも今のところは誤字脱字もありませんし、例題も多いので気に入ってます。

68 :デフォルトの名無しさん:05/01/06 12:18:22
前スレを html 化してもらいました.

Prolog でまったり
http://ruku.qp.tc/dat2ch/0501/06/976462999.html
(http://pc5.2ch.net/test/read.cgi/tech/976462999/)

69 :デフォルトの名無しさん:05/01/07 04:34:58
SWI-Prologには、なぜ利用価値があると思われる組合せを生成する述語がないのだろう?
順列は最近導入されたようだが。

?- combination([a,b,c,d], 2, X). % 4個のものから2個取り出す組合せを全て求める
X = [a, b];
X = [b, c];
...

こういうのあったら、便利だと思うんだよな。パズルを解くときよく使うし。

70 :デフォルトの名無しさん:05/01/08 06:03:20
repeatを使ってリストの合計値を求めたり、階乗計算をしたりできますか?

71 :デフォルトの名無しさん:05/01/08 06:57:54
?- ・・ L = [1,2,3], ・・・,repeat, ・・(2) ・・, _終了条件.
のような質問で、(2)の部分で合計値を求めるということですか?
副作用(仮の述語のassert,retractやグローバル変数への破壊代入)を利用しない限り
無理です。バックトラックしてrepeatに戻って来た時には、副作用データ以外は
元の状態に完全に復帰します。ということは(2)で新たに生成されたもの、
すなわち変数に単一化されたものは何も残らない。

72 :デフォルトの名無しさん:05/01/08 07:42:06
意図していたことは、そのような感じです。

sum([], 0).
sum([X|L], S) :- sum(L, S1), S is X + S1.

上のようなコードをrepeatを使って一行で済ますことができたらなあと思い、質問しました。
大掛かりなことはしたくないので、やはり上のように再帰呼び出しを使うしか無いようですね。



73 :デフォルトの名無しさん:05/01/08 07:48:11
SWI-prolog 5.2.12で、計算の途中でたくさんassertを行う(数千回)プログラムを実行したとき
処理系が落ちるんですが、同様の経験をしたかたはいらっしゃいますか?
バグなのかなあ。



74 :デフォルトの名無しさん:05/01/09 09:38:00
>72 結局、事務処理などにPrologを利用するときには、
この述語を最初に定義することになります。組み込みで持つべきですね。

sum/2は第一引数のリストに
一つでも浮動小数点数があれば、Sは浮動小数点数。
全て整数だとSは整数となります。これだと、
   sum(L,S),write_fromatted('%6d\n',[S]), /* write_formatted/2はCのprintf()と同機能と思ってください */
のような部分で、Sが浮動小数点になるとfailするかexceptionが発生するので
   sum(L,S),(integer(S),write_formatted('%6d\n',[S]);float(S),write_formatted('%6.0f\n',[S])),
と一々せねばならず、やっかいです。
私は sum/2の第一定義節は
sum([],0.0). にして、必ず浮動小数点数になるようにして利用しています。



75 :デフォルトの名無しさん:05/01/09 19:37:45
>69 ちょっと間が抜けてしまいましたが、

combination(_,0,[[]]) :-
  ! .
combination(L,N,[]) :-
  list_length(L,Len),
  Len < N,
  ! .
combination([A|R],N,X) :-
  M is N - 1,
  combination(R,M,Y),
  mapcar(A,Y,Z),
  combination(R,N,X2),
  append(Z,X2,X) .
mapcar(_,[],[]).
mapcar(A,[L|R],[[A|L]|R2])
 :-
  mapcar(A,R,R2).

?- combination([a,b,c,d,e],3,X).

X = [[a,b,c],[a,b,d],[a,b,e],[a,c,d],[a,c,e],[a,d,e],[b,c,d],[b,c,e],[b,d,e],[c,
d,e]].
yes.
?- 
これでよいのですか。


76 :デフォルトの名無しさん:05/01/09 19:58:55
すみません。>69の仕様を勘違いしてました。
私のは全解探索版でした。member/2で取り出せば良い、とは云えますが。


77 :デフォルトの名無しさん:05/01/09 20:38:45
>69
combination(L,N,L) :-
  list_length(L,Len),
  Len = N,
  ! .
combination([A|R],N,[A|Y]) :-
  M is N - 1,
  combination(R,M,Y).
combination([_|R],N,X)
 :-
  combination(R,N,X).
でよいのでしょうか。


78 :デフォルトの名無しさん:05/01/09 21:18:04
ISOのProlog標準化作業が今年から再開されるとのことですが、
>69、72 で示されたような有用な述語類はどういう形で取り込まれて
いけばよいのでしょうか。


79 :デフォルトの名無しさん:05/01/10 01:58:00
>>77
正しい解が得られるようだけど、リストが長くなると処理時間が異常に長くなるよ。

たとえば、こんな例
?- combination([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z], 1, X).

80 :79:05/01/10 02:11:25
ちなみに俺のは、こうなったよ。
下請け用の述語を用意しているので、あんまりきれいでないかも。
改善の余地があるかも。

comb_sub([A|B], A, B).
comb_sub([_|L], A, B) :- comb_sub(L, A, B).

combination(_, 0, []).
combination(L, 1, [A]) :- member(A, L).
combination(L, N, [A|R]) :-
N>1, comb_sub(L, A, B), N1 is N-1,
combination(B, N1, R).

81 :デフォルトの名無しさん:05/01/10 07:01:20
>80 77は、list_length/2は無くさないといけないか。

82 :79:05/01/10 07:21:30
>>81
list_lengthを使うこと自体には問題はないと思うよ。
たぶん>>77の問題点は、最後の節で第2引数をそのままの値で
combinationを再帰呼び出ししていることにあるんじゃないのかな?
それで再帰の停止条件Len=Nがなかなか真にならず、
解につながらない余分な枝が残り続けているのだと思う。

83 :デフォルトの名無しさん:05/01/11 12:34:44
差分リストって使ってます? いまいち効用がわかりません。

84 :デフォルトの名無しさん:05/01/12 12:42:42
事務屋の私は、ほとんど使いません。
キューには何箇所かで使っている。それだけ。


85 :Amalog ◆6l0Hq6/z.w :05/01/12 19:36:17
どうかまたお力をお貸してください。m(__)m

Consider the function f defined as follows:
次のような関数を考えよ。

f(x) = x - 10 if x >100,
f(x) = f(f(x+11)) is x =< 100.

f(x+11)までは出来ました。

moreless(X,Y) :- X >100, Y is X - 10.
moreless(X,Y) :- X=<100,
X1 is X + 11,
moreless(X1,Y).

でもf(f(x+11))はどぉしても出来ません。
moreless(moreless(X1,Y),Y)みたいな感じで出来ると思ったのですが
unknown optionとか言って怒られてしまいます。

moreless(X,Y) :- X=<100,
X1 is X + 11,
moreless(X2,Y),
X2 is moreless(X1,Y).
とかやっても駄目です。
関数が入れ子になった例題なんて載ってないんでさっぱり分かりません。
どうか解決法を教えてください。

86 :Amalog ◆6l0Hq6/z.w :05/01/12 19:37:12
ちなみに流れはこうですよね?
f(100,Y).
100 <= 100,
100 + 11 = 111,

f(111,Y).
111 > 100,
111 - 10 = 101 ←ここまでは出来ました

f(101,Y). ←ここからは出来ません・・・
101 > 100,
101 - 10 = 91,

Y = 91.

87 :デフォルトの名無しさん:05/01/12 19:54:41
単純に
moreless(X,Y) :- X > 100,Y is X-10,!.
moreless(X,Y) :- X =< 100,
  X2 is X+11,
  moreless(X2,Y2),
  moreless(Y2,Y).
ではダメですか。


88 :Amalog ◆6l0Hq6/z.w :05/01/12 20:29:49
>>87
出来ました!
ああ、Y2を二つ目の関数の最初の引数に持ってくるんですね。
これで次回から関数が入れ子になった問題でも(多分)解けると思います。
独学だと自分のペースで勉強できるのはいいんですけど、
一度躓くと先に進めないのが難点ですね・・・これでやっと先に進めます。
ありがとうございました!

89 :鵺鳥 ◆orz.7IBPr6 :05/01/17 17:51:12
最近日本語入力及び出力できるPrologはないですか?
例えば、述語など日本語で定義したり、日本語で返したりなど。

90 :鵺鳥 ◆orz.7IBPr6 :05/01/17 18:15:12
ageないと返答なさそうなのでageますね。

91 :デフォルトの名無しさん:05/01/17 18:50:07
>>89
K-Prologならできます。
インタプリタやライブラリが貧弱ですが。

92 :デフォルトの名無しさん:05/01/17 18:56:39
K-prologは個人ライセンス料が8000円ですが、即使えます。
SWI-Prologはデータとしては、即、利用可能です。関数名(述語名)に
使うには一々シングルクォーツで囲まなくてはならず面倒です。
SWI-PrologでOSがLINUXの場合は一箇所直して、再コンパイルすれば
上記の制限がなくなる上に
_円周率 = 3.14 のように、変数にも漢字が使用できるようになります。
pl-ctypes.c というファイルの文字テーブルを一部書き換えて、
# make
# make install とするだけだと思います。

私が使っているIF/Prologは最も完全なものですが、高価ですし、
最近販売を停止してしまいました。

そのほか、頭文字がA-Zまでprologは全部揃っているそうですが、
半分以上のPrologが使用可能であると聞いたことがあります。

93 :デフォルトの名無しさん:05/01/17 20:22:44
>92 pl-ctypes.c ではなく pl-ctype.c の間違いでした。
この中で、char _PL_char_types[] = {
とテーブルの文字番号129以上を全部 LC に変えてしまうだけでよいはずです。


94 :デフォルトの名無しさん:05/01/18 11:36:47
Prologからデータベースをアクセスしている方、どんな方法を
とっていますか。
とりわけ、SWI-Prologを使用している方に聞きたい。


95 :お願いします:05/01/19 10:45:36
論理式eが与えられた時、eと等価なCNFを求める述語cnf/2を定義せよ。
という問題がわかりません。
誰か教えてくれませんか?

96 :デフォルトの名無しさん:05/01/19 13:00:54
CNFってなんだったかな。第一引数をeとして、第二引数をCNFとすると、
cnf((P :- Q),(not(Q1);P1)) :- cnf(Q,Q1),cnf(P,P1).
cnf(not(P;Q),(not(P1),not(Q1))) :- cnf(P,P1),cnf(Q,Q1).
cnf(not(P,Q),(not(P1);not(Q1))) :- cnf(P,P1),cnf(Q,Q1).
cnf(P,P).
こういう風に書き連ねればよいのだろうか。
全然見当違いのこと書いてるかもしれない。

97 :デフォルトの名無しさん:05/01/19 13:05:27
そうか、
cnf(P,P). の上には
cnf((P,Q),(P1,Q1)) :- cnf(P,P1),cnf(Q,Q1).
cnf((P;Q),(P1;Q1)) :- cnf(P,P1),cnf(Q,Q1).
も必要か。


98 :デフォルトの名無しさん:05/01/19 13:35:37
cnf(not(not(P)),P1) :- cnf(P,P1).
なんてのもありそう。

99 :デフォルトの名無しさん:05/01/19 17:18:26
ちょっと蛇足
:- op(1000,xfy,∧).
:- op(1100,xfy,∨).
:- op(900,fy,¬).
cnfの定義の前に上のオペレータ定義をして、

cnf(¬((P ∨ Q)),(¬P1 ∧ ¬Q1)) :- cnf(P,P1),cnf(Q,Q1).

というように定義することは可能。頭部の引数がそれぞれ( )で
囲んであるあたりが微妙。



100 :デフォルトの名無しさん:05/01/20 13:20:47
100をとれそうなので。
Prologのプログラムでよく使う基本的な述語といえば、
fail/0, !/0, is/2 は別にすると、
repeat/0, member/2 , findall/3 , sub_atom/4か5 , concat_atom/2か3 ,
atom_chars/2, atom_codes/2, list_length/2, list_nth/2,
それからもちろん入出力、
そのほかに案外使うのが、これは方言が多いと思うが, atoi/2, itoa/2 の
類。
課題によっては append/3, sort/2 も使うかもしれない。

組み込みにしてほしいと思うのは
sum/2,
ある要素が現われるまでリストの読み飛ばし、リストの要素置換、
行列演算、
区切り文字のリストを与えられて、文字列から語彙のリストを得るもの。
それから・・・

101 :デフォルトの名無しさん:05/02/01 18:33:09
質問です。
Prologって可変引数は利用できませんよね?

102 :デフォルトの名無しさん:05/02/01 19:25:03
>>101
できません。

Pred(_,_)とPred(_,_,_)は共存できて、全く別物と扱われます。
Pred(_,_)とPred(_,_,_)の意味の橋渡しをする節を記述する
(通常の言語で言えば、変換のコードを書く)ことはできます。

その一般化として、いくつ引数がくるかは不明なPred(_,_,_,...)を
何かとマッチ(Unify)することができるかについてですが、
それは全然できません。

リストという可変長のデータ構造を利用することは、ごく普通に
行われます。

103 :102:05/02/01 19:33:30
で、リストというデータ構造に目を向けると、
[X | Y] と [a, b, c, ... (長さ不明な可変長部分)] をunifyすると
X = a
Y = [b ,c, ... (長さ不明な可変長部分)]
なんて結果が得られる(Yのように変数には複雑な構造をそのまま
保持できる)ので、可変長引数と同等なことができるはずです。

つまり、Predを可変長引数にしたければ、リストを引数にとるように
すればよいことになります。

104 :デフォルトの名無しさん:05/02/01 20:43:22
>>102
ありがとうございました。
可変長はあきらめて、リストで実現することにしました。

105 :デフォルトの名無しさん:05/02/01 21:57:03
さらに質問なんですが。
Prologの処理系によって、リストの最大の長さって決まるものなんでしょうか?
標準規格で最大何個まではリストで表現できなければならない、とかって
ありますか?

106 :デフォルトの名無しさん:05/02/02 13:30:56
ISO標準にはリストの最大値等の記述はないようです。

?- Len=10000000,findall(N,for(1,N,Len),_),fail;true.

上のような、質問のLenの値を順に増やしていくと、
私が使っているIF/Prologで、ヒープ領域やグローバルスタックの
初期値や最大値を全てDefaultで実行した場合、
2000万から3000万の間で急に遅くなります。一回のGCに要する時間と
関係があるようです。スタックの大きさの初期値を適切に指定すれば
億単位の要素も可能ではないかと思います。
?- Len=1000000,findall(X,(for(1,N,Len),concat_atom([a,N],X)),_),fail;true.
すなわち整数ではなく、アトムを生成すると、100万回を超えたあたりで、
セグメンテーションエラーとなることが多い。
これもリストの要素数が原因ということではありませんね。




107 :デフォルトの名無しさん:05/02/05 09:38:22
大学で、Prologを半年習いました。
それで質問なのですが、
面白い言語だと思いましたが、
なぜ、こんなにマイナーなのですか。


108 :デフォルトの名無しさん:05/02/05 11:18:49
役に立つプログラムを作りにくいからじゃないかな。

109 :デフォルトの名無しさん:05/02/05 12:39:30
>108 最終的にはそういうことになるでしょう。
・ 言語仕様が大規模なプロジェクト向きでない。
・ グラフィック環境を前提にしたAPIがほとんどない。
・ 処理系に定番ソフトがない。


110 :デフォルトの名無しさん:05/02/05 14:26:53
>>109
どれも必要ない機能だ。

111 :109:05/02/05 14:43:13
>110 その通り。世の中で、
役に立つプログラムが作られていないから、
使われないともいえる。
ただ、定番がないのは普及には不利だった。


112 :デフォルトの名無しさん:05/02/05 17:50:02
Webインターフェースつけてやったらいいものになるんじゃ?
入出力をCGIにしとけば、グラフィックもつかえるだろうし。

113 :Aransk:05/02/05 18:36:40
どなたか知っておられたら教えて下さい。
Prologは昔日本の官庁主導プロジェクトに
おいてメインの言語として利用されたと
聞いております。が、うまく行かなかった
とも…。
もし原因が当時のハード事情であれば
復活する可能性はないのでしょうか?
オブジェクト指向言語も当初は使いものに
ならないほど遅かったが今は全盛です。
出始めのJavaもそうだったと…。



114 :デフォルトの名無しさん:05/02/05 19:53:10
>>113
第5世代コンピュータプロジェクトのこと?
http://www.google.co.jp/search?q=%E7%AC%AC5%E4%B8%96%E4%BB%A3%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF+Prolog&hl=ja&c2coff=1&rls=GGLD%2CGGLD%3A2003-39%2CGGLD%3Aja

115 :109:05/02/05 20:00:33
うまくいかなかったと思っているのは知らない人だけです。
正確にいうと、最初からPrologが使われたわけではない、ということです。
新世代コンピュータ技術開発機構では最初はオブジェクト指向Prologの
ESPが使われ、Prologマシンが作られました。ここで機械語、OS記述言語と
してのPrologの特性が検証されました。しかし、この機構は数年でその活動の
主力を並列処理に移し、以後はPrologと似てはいるが、あまり接点のない
並列論理型言語KL1、後にKLICという言語上で開発が進められました。
研究メンバーは献身的にPrologの普及、教育にも
尽力しましたが、研究の対象は最初から1-2年でPrologから離れてしまったのです。

したがって現在のPrologに関する問題は、新世代コンピュータ技術開発機構や
当時のコンピュータが遅かったこととは何の関係もありません。


116 :109:05/02/05 20:24:56
続きです。私なりにPrologがうまく普及しなかった理由をまとめると、
・ >109に示したような汎用言語の道をとる必要はなかったのですが、
世の中が、高水準言語とインターフェイスをとる方向へ進まなかった。
ネットワークとユーザインタフェイスの整備のみ進んだ。
・ 人工知能の研究成果を産業に剽窃、応用しようという所謂AIブームに
よって持ち上げられすぎた。結果としてAIバブルに飲み込まれた。
・ ビル・ゲイツがマイクロソフトの中核言語としようと研究したが、
欠陥を克服できず放棄し、VBを開発したという噂が流れた。
・ IBMシステム38の開発が早すぎた。Prologマシンのアーキテクチャとして
最適なこのマシンの開発は70年代後半で、Prologを採用するには早すぎた。

相当に怪しげな分析ですが、いかがでしょうか。


117 :デフォルトの名無しさん:05/02/05 20:57:57
超準関数型言語Aransk
http://pc5.2ch.net/test/read.cgi/tech/1082176723/

118 :デフォルトの名無しさん:05/02/05 21:02:57
Aransk Web
http://homepage3.nifty.com/Aransk/contents2.html

でまあ、本論に復帰して関数型言語ですが、主として大学や
研究機関を中心としたアカデミックな色彩の濃い言語ですから
比較的ドロドロの部分が少なく、言わばディレッタント的な好みで
やっている人が多いと思われます。(マイクロソフトもF#は商業化
しない、と言明しております。)

Prologなんか第5世代コンピューター時代には政、官、財の間で
かなりドロドロに揉まれましたが、今はすっかり枯れております。

現役のプログラマーに関数言語やPrologが好きだと言っても
全然脅威にはなりません。言語宗教戦争から無縁の存在です。

関数型言語のClarityの功徳であります。
不可称、不可量、不可思議であります。

ではコンピューター言語宗教談義はこの辺りで。

119 :デフォルトの名無しさん:05/02/06 01:11:19
パーサージェネレーター見たいな位置づけで使われれば、
それなりに面白いと思うけど。


120 :Amalog ◆6l0Hq6/z.w :05/02/06 05:12:20
あるプログラマーが
「Cなんかで大きな大きなプログラムを書く場合でも、
そのアルゴリズムが本当に動くかどうかはPrologで確認して
動くと分かったら実際にCで組み始める」
とか言ってました。
それが本当ならカコイイ!!!

121 :Aransk:05/02/06 18:05:17
>>109,119,120
>・ 人工知能の研究成果を産業に剽窃、応用しようという所謂AIブームに
>よって持ち上げられすぎた。結果としてAIバブルに飲み込まれた。
最近思うんですが、関数型言語Lispなんかもグラフ理論を中心ロジック
にしてエクスパートシステムなどのAI分野で活躍しています。
将棋ソフトをLispで組んでるなんて聞いたことがあります。
ところがPrologって過去の栄光から現在を比較すると
「枯れすぎて」いる。
マシーンスペックの向上により復活の可能性は
ないのか?パーサージェネレーター的でもっと
AI指向の分野で活躍の機会はないのか?
PrologでWeb Agentとかの発想は無いものか?
(小泉さんにPrologを勉強してもらい、「色々」
国会答弁を論理的にするとか…)





122 :デフォルトの名無しさん:05/02/06 21:30:42
>Prologって過去の栄光から現在を比較すると「枯れすぎて」いる。
正直、そう感じますね。
Prologを使ったAI的な応用は数では増え続けているようですが、
GUIがらみのプログラミングの爆発的な展開に比較すると、
枯れている、と感じられても仕方がない。
SonyのAIBOはPrologで書かれているという噂もありますが。
スケジュール管理など「子供だまし」とでも形容したくなるような
容易さで書けてしまう。しかし、スケジュール管理が本当に必要なのは
企業の総務部で事務計算とは縁があっても、AIとはもともと無縁です。
Prologは言語仕様とかではなく、利用目的(分野)とPrologのイメージの
ミスマッチというか、ちぐはぐがあまりに多い。
Prologは中小「企業」にこそ最適な言語でるということをもう少し
知らしめる努力が必要だった。その点は私に相当責任があります。
>マシーンスペックの向上により復活の可能性はないのか?
私のところでは30万件以上のRDBのtuppleを述語として登録して、
オンメモリーで検索しています。IF/Prologは高価ですが、ほとんど
バグもありませんし、スタックがオーバーフローするなどの経験も
ありません。これらの点では10数年前からまったく問題ありません。
Web Agentなどといえるものではありませんが、Webはもちろん、mailから
Prologを制御して、解をメールやFAXに転送するサービスなどもやっています。

全てのデバイスに当然のようにPrologインタプリタが付いている世界を
目指したいですね。情報家電などは最有力分野でしょう。


123 :デフォルトの名無しさん:05/02/07 00:32:12
処理系は十分にコンパクトなのですか?
組込みだとその辺が問題でしょうから。

124 :デフォルトの名無しさん:05/02/07 09:09:24
>123 他の言語のことを知らないので。
インタプリタのメインループとパーサ(readとかassertの時使う)は
十分にコンパクトですね。ただ、スタック言語ですから、
それぞれのデバイスに最適なスタックをどう確保すればよいかに
ついては私にはわかりません。


125 :デフォルトの名無しさん:05/02/07 09:49:59
いまはメモリが安いから、スタック確保についてはあまり心配ないかもしれませんね。
ちょっと研究してみようかな。

126 :デフォルトの名無しさん:05/02/07 10:26:48
中間バイトコードに落として、実行したりネットワークを流れる
ことになりますか。
情報家電のデバイスにどうかというのは、将来エンドユーザーが
自身でデバイスの制御を自由に変えたいという要求を持ち始めた場合、
デバイスに書き込む言語としてはJAVAとか.NETでは
エンドユーザーに負担がかかりすぎる。
もっともシンプルで高い記述力のある言語としては現時点では
Prologが有力ということになります。
家電メーカーが全てを仕組んで販売するのはやがて限界にきます。
その時のチャンスをつかみたい。そんな意味での記述でした。



127 :デフォルトの名無しさん:05/02/07 12:23:40
面白いですね。
それに向かって何をしたらいいのかよくわからないですが
そういう方向性ってのを目指してる人はほかにいないのかな。


128 :Aransk:05/02/07 17:40:01
「枯れすぎている」と表現しましたのは
当時かなりの人々がPrologを学び、使いこなせた
はずですよね?
言わばかなりの言語学習投資を行った。
つまり付加逆の時間とコスト(頭脳集中)を
払った訳です。どこへ消えてしまったのか?
第五世代「時代」は日本がPrologでは世界最先端で
あったと聞くと…不思議ですよね?


129 :デフォルトの名無しさん:05/02/07 17:51:14
>>128
日本の情報系の研究者ってものすごく厭きっぽい気がするんですよ。
何か作り上げて形にするというよりも、なんとなく流行りモノをみつけて
ちょこちょこっと触ってなんとなくそれっぽいものをつくって、
予算がっぽりとって、それが終わると続きはせずに次に行く。

そんなだから払ったはずの時間とコストはきえてしまうとそんな印象を持ってます。
ひとつには予算システムにも問題があって、新しいものにはたくさん予算をつけるけど
古いものの継続開発や維持の予算はガンガン削ってしまうという形に
お役所側もなっているのではないでしょうか。


130 :デフォルトの名無しさん:05/02/07 17:56:55
はぁ?

131 :デフォルトの名無しさん:05/02/07 19:40:56
>>122
> 私のところでは30万件以上のRDBのtuppleを述語として登録して、
> オンメモリーで検索しています。
これのイメージがよくわからないんですけれど、
RDBをrecordを表す述語を並べた(テキスト)ファイルによって実現しているということですか?

実行開始時にファイルから述語DBを読み込み、
実行中はrecordの追加/削除をassert/retractによって行い、
終了時にはすべての述語をファイルに書き出す

という感じなのでしょうか?

132 :デフォルトの名無しさん:05/02/07 20:36:59
>131 売上テーブルが
[売上]出荷場所,出荷日,伝票番号,顧客番号,商品番号,数量,単価,金額
から構成されていると(実際にはもう少し複雑)、副目標
売上(_出荷場所,_出荷日,_伝票番号,_顧客番号,_商品番号,_数量,_単価,_金額)
で参照されるような述語として登録しています。
バッチ更新時はトランザクションとして一連の要求を成功した時に
save_system/1が実行され現在の全環境が保存されます。
対話モードすなわち、伝票手入力の場合は、入力後assertされた直後に
同様の保存が強制的に起こります。環境が破壊されることを避けるため
assertzやretractをエンドユーザーは直接には使用できないようになっています。
システムは保守作業以外には途絶えることはありませんから、何年でも
この状態が続きます。
基本的には、このようなデータベース述語と他の述語の区別をつけないことを
目標にしていますが、
実際には、10万節を超える述語だけは特別扱いして、データベース述語を
管理するPrologシステムをバックエンドに置いています。
述語の変更等が頻繁に起こるフロントサイドからソケット通信で
負節を送り込む方法で処理しています。

かって、この部分はORACLEで管理され、OCIというC言語インターフェイスを
介してアクセスしていた部分ですが、現在はPostgresSQLに一日一回、
変更された部分のみ書き出しているに過ぎません。このデータベースは
5年以上前の明細データを調べるといったような特殊処理を除き参照等には
使われていません。


133 :デフォルトの名無しさん:05/02/07 20:47:46
>>132
なるほど。説明ありがとうございます。
大規模なテーブルはRDBMSにprologインタフェースを被せて管理し、
それ以外は普通に述語として扱っているんですね。
joinとか件数が多いと性能がでないのでは、と思いましたが10^4オーダー
なら問題ないのでしょうね。

昔swi-prologを使ってRDBMSもどきの処理をやったことがあるのですが、
大量に述語をassertするとすぐに処理系が落ちて大変でした。
ちゃんとした製品を使わないと駄目ですね。

134 :デフォルトの名無しさん:05/02/08 10:23:02
SWI-Prologでまだヘビーな使い方をしたことはないので詳しくわかりません。
私が、RDBシステムベースから、オンメモリーPrologベースに切り替えたのは
CPUを1.7GHzから3.0GHzに変更した昨春です。
Prologの速度はCPUのそれもクロック速度と比例しますから、少し前に
ダメだと評価したことが現在では十分に利用可能というケースも
多いようです。環境が変わり次第、もう一度評価されることを
お勧めします。


135 :Aransk:05/02/08 16:10:36
>>129
大分以前にどっかのメガネ屋さんのシステムを
Prologで開発したらしい。経験の無い店員でも
お客の要望を入れるだけで最適のメガネを
選定できるエクスパート・システムのような
ものだとか?
こんな使い方もあるんですね。
>>132
RDBより直接XMLデータを操作したほうが
Prologには合っているように思われますが?


136 :デフォルトの名無しさん:05/02/08 17:55:14
>RDBより直接XMLデータを操作したほうが
>Prologには合っているように思われますが?
XMLについてはすこし考えを整理してから書きます。
>121 のWeb agent とは全然違うのですが、
私のところのWebサイト(業務用で非公開)では空いている窓に
?- 周防内侍.
とタイプしてSubmitすると

山桜をしむ心のいくたびかちる木(こ)のもとに行きかへるらむ
夜をかさね待ちかね山の郭公雲ゐのよそに一声ぞきく
さみだれにあらぬ今日さへはれせねば空も悲しきことやしるらん
春の夜の夢ばかりなる手枕にかひなくたたむ名こそをしけれ
恋ひわびてながむる空の浮雲やわが下もえのけぶりなるらん
契りしにあらぬつらさも逢ふことのなきにはえこそ恨みざりけれ
すみわびて我さへ軒の忍草しのぶかたがたしげき宿かな
かくしつつ夕の雲となりもせばあはれかけても誰かしのばむ

のような解が返ってきます。これは高名な和歌サイトである「千人万首」
から周防内侍の和歌だけを抽出してきて表示しています。
もちろん周防内侍だけでなく、九条良経でも永福門院でも源頼朝でも
同様に抽出してきます。「千人万首」はXMLサイトではなくHTMLですが、
このような実験はPrologの可能性あるいは多言語に対しての優位性を探る
上では欠かせないと思っています。



137 :デフォルトの名無しさん:05/02/08 19:59:01
若干の補足。 本来 ?- 請求書印刷('20050131').
というような利用が予想されるWebサイトに ?- 周防内侍.
という述語として未定義の質問が来る。これにたいして、
もしかすると、周防内侍とは歌人かもしれないとシステムが勝手に
考えて、その分野に質問にいく。探索範囲は今のところ歌人だけです。
何故、和歌か歌人かというと、なにより一単位の長さが短い。しかも、
形態素解析などの課題としやすい。辞書を作ること自体に意味がある。
など、結構奥行きがあります。こんな分野をもう少し広げて、
次は、周防内侍が歌人であることを推論する。Prologの値打ちが最も
現われる部分ですね。このくらいまでくるとWeb agent の資格がでてくる
かも知れません。


138 :デフォルトの名無しさん:05/02/08 20:23:08
> ?- 周防内侍.

?- 周防内侍(X), print(X), fail.

に処理系が展開してるってこと?
便利かも知れないが、その利点はprologに由来するものではないような。

139 :デフォルトの名無しさん:05/02/08 20:57:02
はい、CでもC++でもVBでもまったく同じことができる。
問題はPrologだと何か有利なことがあるかないか。
その比較ができればよい。Prologだから、次から次へと
こういう分野が広げられました。こんな短い期間で。
ということを示せればよいのでしょう。

HTMLファイルを解析して、歌人が記述されている部分のタグを確定して、
その中の<A>タグから、未編集の歌を引き出す部分を完全に自動で
やりたい。ですが、今のところかなりヒントというか、補助的な情報(この場合は
千人万首の「癖」)を神様みたいな視点で私が与えないと、正しくとれてこない。
実際にはまだまだです。


140 :Aransk:05/02/09 15:04:41
オブジェクト指向言語をやり始めの頃は
デザインパターンとかを覚えて
なんでもその思考パターンにはめ込もうと
したり、クラスー>インスタンス関係で
考えたりしますよね?
Prologを始めると物の見方がこう
変化するよ。なんてないんですかね?
英語で話すと論理的にならざる得ない。
少なくとも主語だけは…みたいな。

141 :デフォルトの名無しさん:05/02/09 17:51:06
フレームのような構造を嫌うようになりますね。できる限り、フラットで
引数の少ない関数を好むようになる。こういうデータ構造に対する嗜好の
変化は、物の見方に影響を与えるかもしれない。私は20年もPrologで
書き続けているから多分随分影響されていると思いますが、一般には
影響をうける前にプログラムが完成してしまいますらどうでしょうか。


142 :デフォルトの名無しさん:05/02/09 18:10:03
Prologって囲碁に近い。こう打って、こう来たら、次はこう打って、なんて
考えたらダメ。見た途端にこのパターンはこうなるものと図像的に直感される。
その繰り返しで書いていく。したがって、このパターン認識の邪魔になる
「複雑さ」を排除しようという意識が働きます。
常に、一瞥で済ませようというプログラミング態度が生まれます。
論理プログラミングというと思考力が重要と思われがちですが、
速読術的な直感が働かされている気がします。



143 :Aransk:05/02/10 17:16:22
>>141,142
>論理プログラミングというと思考力が重要と思われがちですが、
>速読術的な直感が働かされている気がします。

さすがにご慧眼。
直感的に言わせて頂ければ、それを活かすことでは
ないでしょうか。つまり手続き言語が既にやっている
分野ではなく(GUIやDBMなど)Prolog独自の分野を
発見すること。
残念ながらワタクシあまりにC++やJavaに嵌りすぎて
おり、半ば母国語と化しております。
関数型言語でも母国語に変換して意味を理解する
始末です。Prologは正直、学習コストが高すぎて
ギブアップしました。APLやJも…。
しかしその学習コストの高さは差異化にも
なり得る。これまで手続き型言語が
生み出しえなかったアイデアこそ
勝負所ではないでしょうか。
プログラマーの思考に与える影響を含めて。


144 :デフォルトの名無しさん:05/02/11 04:03:04
Prologみたいな言語って何型言語っていうの日本語で

145 :デフォルトの名無しさん:05/02/11 04:23:25
ロンリー


146 :デフォルトの名無しさん:05/02/11 14:55:31
論理型言語てデータマイニングとかセマンティックWEVで使われてないか。
あと形式的仕様記述とか。

147 :Aransk:05/02/11 16:07:21
>>141
>フレームのような構造を嫌うようになりますね。できる限り、フラットで
>引数の少ない関数を好むようになる。
例えば
ttp://www.cs.nps.navy.mil/people/faculty/rowe/book/chap12.html
People must exploit expectations to understand natural languages,
because speakers and writers try to avoid wordiness. So it's not
surprising that frames are very helpful for natural-language
understanding by computers, for the semantics or
meaning-assignment subarea. That is, with a good frame
representation we can efficiently capture the meaning of
some natural-language sentences, so as to answer questions about it.
こんな考え方もあるようですね?



148 :デフォルトの名無しさん:05/02/12 11:20:09
>146 リンクの張り方をしらないので、すみません。
http://www.ifcomputer.co.jp/inap/inap2001/home_en.html
などありそうです。


149 :デフォルトの名無しさん:05/02/12 13:31:38
>141,142,143,147
p(X,Y) :- X=[f1(X1),f2(X2),f3(X3)],p1(X1,Y1),p2(X2,Y2),p3(X3,Y3),p4(Y1,Y2,Y3,Y).

p/2が呼び出される述語とするとき、その中で上のX1,X2,X3のように
ストリームが分岐するコードはできれば書きたくない、ということですね。
Prologのプログラムの焦点は徹頭徹尾ストリーム(引数)上の変数の解決なので、
そのストリームはできるだけ単純に赤、青、緑というような
帯になって最後まで繋がっていてほしい。途中から、紫や茶や橙に化けて、
やがて、いつのまにか消えていく、というようなコードは書きたくない。


150 :Aransk:05/02/12 15:33:00
>>149
>そのストリームはできるだけ単純に赤、青、緑というような
>帯になって最後まで繋がっていてほしい。途中から、紫や茶や橙に化けて、
>やがて、いつのまにか消えていく、というようなコードは書きたくない。
この考え方は関数型言語の純粋性に近いですね。
破壊的手法を出来るだけ使いたくない。
入れポン出しポンのままでいたい。というか…。
ところで
ttp://www.cs.nps.navy.mil/people/faculty/rowe/book/chap12.html
にあるSlotってCommonLispのオブジェクト指向部分に出てくる
Slotとほぼ同じように素人的には思われますが、どうなんですかねぇ?




151 :デフォルトの名無しさん:05/02/13 21:34:57
>150 前半部分についてのコメントですが、
Prolog ::: ストリームプログラミング ::: スタックプログラミング
の感覚ですね。なんてことはない。スタックの出し入れをしてるだけだと。


152 :デフォルトの名無しさん:05/02/13 21:56:00
データに依存関係がないとき、単位節で定義し、非決定性の処理を、
依存関係があるとき(集約関係)はリストに構成して、再帰的に処理
します。しかし、
・ストリームのルーツをはっきりさせたい
・プログラムを書き進んでから集約関係を発見することもある
等の理由から、
findall/3で単位節定義を予めリストに構成してしまう(自前のスタックに
詰め直す)ことも多い。
ここら辺はPrologプログラミングの問題点(弱点)だと思います。


153 :デフォルトの名無しさん:05/02/15 02:09:27
>146 http://www.dfki.uni-kl.de/~boley/rdfphtml/

154 :デフォルトの名無しさん:05/02/19 17:17:32
>>132
単一ユーザーの場合、データベース更新後のシステムセーブでいける
だろうが、複数ユーザーが場合どうなるか。
サーバーがfork()で別の環境を作っている場合、それぞれ作業中の
Prolog同士でデータベースの更新時にメッセージを交換して、情報を
共有しなくてはならない。
Prologデータベースの課題はそこだった筈だが。


155 :デフォルトの名無しさん:05/02/19 21:04:17
式の簡略化で
3*(5*x^2)や3*(4*x^2+2*x^3+5)を簡単にする場合

s(Y+Z,S) :- s(Y,SY),s(Z,SZ),s1(SY+SZ,S).
s(Y*Z,S) :- s(Y,SY),s(Z,SZ),s1(SY*SZ,S).
s(Y,Y).
s(Y-Z,S) :- s(Y,SY),s(Z,SZ),s1(SY-SZ,S).
s(Y^Z,S) :- s(Y,SY),s(Z,SZ),s1(SY^SZ,S).
s1(0+Z,Z).
s1(Y+0,Y).
s1(1*Z,Z).
s1(Y*1,Y).
s1(Y,Y).
s1(N+M,S) :- integer(N),integer(M),S is N+M.
s1(N-M,S) :- integer(N),integer(M),S is N-M.
s1(N*M,S) :- integer(N),integer(M),S is N*M.
s1(N^M,S) :- integer(N),integer(M),S is N^M.
s1(_Y*0,0).
s1(Y-0,Y).
s1(Y^1,Y).
s1(_Y^0,1).
s1(N*(M*Z),S*Z) :- integer(N),integer(M),S is N*M.
s1(N*(Y+Z),N*S) :- integer(N),S = Y+Z.

だけではうまくいかないんですが後何を加えればいいんですか?
述語s/2は一般的な式の簡略化を行い,述語s1/2は部分式が既に簡略化されている式の簡略化を行います。
最後の2式に問題があると思うのですが。




156 :デフォルトの名無しさん:05/02/20 14:58:24
例1: 述語の順序
例2: 分配法則

157 :デフォルトの名無しさん:05/02/20 15:57:15
順序が大事なんですね
順番変えたらいけました
ありがとうございます。

158 :デフォルトの名無しさん:05/02/20 23:28:11
>>154
>サーバーがfork()で別の環境を作っている場合、それぞれ作業中の
>Prolog同士でデータベースの更新時にメッセージを交換して、情報を
>共有しなくてはならない。
きびしい指摘ですね。実は私のところでは更新を許可されたユーザは
一人、一端末に限定しています。したがって参照するユーザは入り直せば
最新にほぼ近いデータが参照できるでしょう、という考え方です。
しかし、これではシステムとしては制限がありすぎてしかも不完全です。
それで、現在は全く使ってはいませんが、SMTPとPOP3を利用して、更新時に他の
ユーザにmailで同報し、各ユーザはインタプリタのトップ、質問の実行の
冒頭にmailから取り出し、メールの中の質問を優先することによって、
データベース更新の同期をとるという機能をもっています。
fork()された環境がどのメールアカウントからメールを引けばよいか、などの
記述部分が複雑になりますが、TTY端末からの全く独立した環境でも、
fork()され、子タスクとして立ち上がった環境でも共通して利用でき、
少なくとも実験レベルでは成功しています。

159 :デフォルトの名無しさん:05/02/21 13:12:51
>>158 所謂バッチ更新はどうなりますか。

160 :デフォルトの名無しさん:05/02/21 14:04:11
>>159 同報による同期をとる場合、システムセーブをするPrologシステムは
一箇所です。WebでPrologサーバーをサービスする場合も同じだと思うのですが、
更新システムは元の親タスクだけです。
端末ごとのマルチユーザーシステムの場合でも、永続システムを決めておいて、
特権的にシステムセーブを行います。

161 :デフォルトの名無しさん:05/02/22 13:16:10
webは一般的には読出しばかりで、書き込みはすくないだろうから、work aroundはいろいろ
考えられそうだ

162 :さっぱり分かりません:05/02/22 18:37:49
論理式eが与えられた時、eと等価なCNFを求める述語cnf/2を定義せよ。
という問題がわかりません。
誰か教えてくれませんか?

163 :デフォルトの名無しさん:05/02/22 21:05:41
implicationの除去、notの整理までは簡単だけど、分配法則を繰り返し適用するところが
難しいね。どうやるのだろう。

:- op(110,yfy,and).
:- op(120,yfy,or).
:- op(130,yfy,imp).
:- op(100,fy,not).

impE(X, X) :- atom(X), !.
impE(not F, not G) :- !, impE(F, G).
impE(F1 and F2, G1 and G2) :- !, impE(F1,G1), impE(F2,G2).
impE(F1 or F2, G1 or G2) :- !, impE(F1,G1), impE(F2,G2).
impE(F1 imp F2, not G1 or G2) :- !, impE(F1,G1), impE(F2,G2).

notE(X, X) :- atom(X), !.
notE(not X, not X) :- atom(X), !.
notE(not (not F), G) :- !, notE(F, G).
notE(not (F1 and F2), G1 or G2) :- !, notE(not F1, G1), notE(not F2, G2).
notE(not (F1 or F2), G1 and G2) :- !, notE(not F1, G1), notE(not F2, G2).
notE(F1 and F2, G1 and G2) :- !, notE(F1, G1), notE(F2, G2).
notE(F1 or F2, G1 or G2) :- !, notE(F1, G1), notE(F2, G2).

164 :デフォルトの名無しさん:05/02/22 21:07:03
上の変換後

orDist(F1 or (F2 and F3), (F1 or F2) and (F1 or F3)).
orDist((F2 and F3) or F1, (F1 or F2) and (F1 or F3)).

をくりかえし適用すればよいはずだけど…

165 :デフォルトの名無しさん:05/02/26 00:11:26
combination(_, 0, []) :- !.

combination([X | Tail], N, [X | R]) :-
N1 is N - 1, combination(Tail, N1, R).

combination([X | Tail], N, R) :-
combination(Tail, N, R).

72 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)