1 :デフォルトの名無しさん:2009/02/25(水) 20:23:54
過去スレ
Prologでまったり Part3
http://pc11.2ch.net/test/read.cgi/tech/1193354806/
PrologでまったりPart 2
http://pc11.2ch.net/test/read.cgi/tech/1102664221/
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/

8 :デフォルトの名無しさん:2009/03/07(土) 11:57:29
以下の住所に関する事実
address([bitdiddle, ben], [slumerville, [ridge, road], 10]).
address([hacker, alyssa, p], [cambridge, [mass, ave], 78]).
address([fect, cy, d], [cambridge, [ames, street], 3]).
address([tweakit, lem, e], [boston, [bay, state, road], 22]).
address([reasoner, louis], [slumerville, [pine, tree, road], 80]).
address([warbucks, oliver], [swellesley, [top, heap, road]]).
address([scrooge, eben], [weston, [shady, lane], 10]).
address([cratchet, robert], [allston, [n, harvard, street], 16]).
address([aull, dewitt], [slumerville, [onion, square], 5]).
から、各々近場にいる人について述べる述語livesNearを作りたいのですが、
livesNear(Person1, Person2) :- address(Person1, [Town|Rest1]),
                address(Person2, [Town|Rest2]),
                not(same(Person1, Person2)).
こう作ってしまう場合、livesNear(P,Q)と問い合わせをすると(Aさん,Bさん)
という組み合わせと、(Bさん、Aさん)という入れ替えたものの2つが重複
して出てくることになります。
重複しないようにするにはどうすればいいでしょうか。

26 :デフォルトの名無しさん:2009/03/11(水) 06:49:31
httpd_status_code(100,'Continue','この応答はクライアントへの仮の応答です。多くの
場合、プロキシーやサーバーは、最終的な応答を返すまでにはまだ時間がかかる場合にこ
のコードを使います。'
httpd_status_code(101,'Switching Protocols','HTTP/1.1では現在は使われていません
が、準拠しているアプリケーションがUpgradeヘッダーに示される、より有利なプロトコ
ルや効果的なプロトコルに切り替えようとしていることを示します。').
httpd_status_code(200,'OK','全般的に成功したことを示します。').
httpd_status_code(201,'Created','このコードは、PUTリクエストへのレスポンスで用い
ることができるコードで、新しいリソースが作成されて利用可能であることを示します')
.
<以下略>
この述語の場合は、amazon.co.jpで見る からの
全コピーであることは明らかです。実際、Prolog述語はこういうのだらけ。
前スレにちょっとだけ著作権の話がでたと思うけど書物を写し取った述語の
公開できるのはどの範囲か。Webサイトの場合はどうか。

110 :デフォルトの名無しさん:2009/05/20(水) 14:21:04
SWI-PrologでIF/Prologのparse_atom/2のような事を行いたいのですが、
どのようにすれば良いかご存知の方いらっしゃいませんか。

163 :デフォルトの名無しさん:2009/05/25(月) 22:06:50
再起処理で一番上流だけを求めるってできる?

308 :デフォルトの名無しさん:2009/06/24(水) 10:56:16
?-g1.
input=taro.
input=jiro.
input=2
input=..
.
input=end.
yes
endが入力されるまで繰り返し、入力をしるg1を作りたいんですけど、全くわかりません。知恵を貸して下さい。

325 :デフォルトの名無しさん:2009/06/25(木) 20:49:31
<実行結果>
split(5, [3,7,2,6,5,8], Before, After).

Before = [3,2,5] (5と同じか、小さい数のリスト)
After = [7,6,8] (5より大きい数のリスト)
となるのを作りたいのですがどうしたら良いのでしょうか?

326 :デフォルトの名無しさん:2009/06/25(木) 20:50:19
/*停止条件*/
split([],[],[]).
split([A],[A],[]).
/*再帰条件*/
/*入力した変数Nより小さい場合 */
split([A,B|R],[A|T1],[B|T2]) :-
A >= B,
split(R,[A|T1],T2).
/* 入力した変数Nより大きい場合 */
split([A,B|R],[A|T1],[B|T2]) :-
A < B,
split(R,T1,[B|T2]). と作ってみたのですが・・・・。だめでした

328 :デフォルトの名無しさん:2009/06/25(木) 21:10:09
>>325-326
swi-prologで作ってみました。
参考にしてみてください。

split(_, [], [], []).
split(X, [H|L], [H|B], A) :-
H =< X,
!,
split(X, L, B, A).
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).


332 :デフォルトの名無しさん:2009/06/25(木) 23:38:11
split(X, [], [], []).ではXを空リスト3つに分けているのですか?
否定(?)を利用してますがなくても問題ないですよね?

連レスすいません


337 :デフォルトの名無しさん:2009/06/26(金) 05:09:00
私たちって言うな

338 :デフォルトの名無しさん:2009/06/26(金) 05:23:14
>>337
リストの再帰で、
[]になった場合の検証から入るプログラマって
そんなにいるかな。まあ、時間的には一瞬だけど。
もし、変数が来たらは、常に注意を張りながらだと思うけど。

339 :デフォルトの名無しさん:2009/06/26(金) 05:37:18
>>338
宣言的でありたいというのがある。
できることなら停止節なんて省略したい。
こういう姿勢だから、考えないね。


346 :デフォルトの名無しさん:2009/06/26(金) 21:44:57
カット(!)はまだ勉強していない、という前提で進めた方がいいんでしょうか

347 :デフォルトの名無しさん:2009/06/26(金) 21:47:54
>>332
> 否定(?)を利用してますがなくても問題ないですよね?

これはなぜそう思ったんですか

348 :デフォルトの名無しさん:2009/06/26(金) 21:56:13
>>326
> /*入力した変数Nより小さい場合 */
> split([A,B|R],[A|T1],[B|T2]) :-
> A >= B,
> split(R,[A|T1],T2).

この「変数N」というようなコメントは、問題についていたヒントか何かですか

349 :デフォルトの名無しさん:2009/06/26(金) 22:31:18
Prologって面白すぎ。もっと流行ればよいのに。

350 :デフォルトの名無しさん:2009/06/27(土) 01:46:01
>>346さん
軽く説明された程度です
>>347さん
授業の説明だと余分なところまでマッチングしないようにするためだと聞いたので
なくてもいいのかなぁと
>>348さん
そこは自分でプログラムするときわかりやすいように書いてみただけです
>>349さん
面白いですけど難しくて頭が痛くなりますw

353 :デフォルトの名無しさん:2009/06/27(土) 06:05:07
>>350
いろんな言語で宿題スレ
http://pc12.2ch.net/test/read.cgi/tech/1242876647/
にPrologのプログラムが沢山載っています。
間違ってるところや、それを逐次修正していく過程が晒されている部分。
処理系依存(あるPrologでは動くが別のPrologでは述語未定義となり動かない)の
ところも多いから、いろいろな意味で勉強になると思います。

354 :デフォルトの名無しさん:2009/06/27(土) 08:44:23
自演乙

417 :デフォルトの名無しさん:2009/07/20(月) 23:29:08
他スレで質問したのですが流れてしまったのでこちらで質問させてください
?- con2(2, [1,3]).
no
?- con2(1, [2,3]).
yes
と答えるようにしたいのですがどうしたらよいのでしょうか?

418 :デフォルトの名無しさん:2009/07/21(火) 00:06:42
con2(1, [2,3])だけをyesとしたいのであれば、

con2(1, [2,3]).

と定義するだけでOK。

419 :デフォルトの名無しさん:2009/07/21(火) 00:08:42
>>417
con2(X,Y) :- X = 1, Y = [2,3].


420 :デフォルトの名無しさん:2009/07/21(火) 00:29:14
>>418さん>>419さん
言葉が足りていませんでした・・・。
今、ハノイの塔の問題を作っていて
ペグの上に載るディスクは常にそのペグの最小ではならないと
移動先でもディスクは最小でないとならないって言う制約の判定をする部分を
作っていてそこに当たる部分なんですが・・・。

途中までは作って制約の部分の製作がわからなかったのでこちらで質問させて
いただきました

未完成のプログラム乗せたほうがいいですか?

421 :デフォルトの名無しさん:2009/07/21(火) 02:35:46
>>420
一番上の円盤(B)がAより大きい
con2(A,[B|R]) :- A < B.

422 :デフォルトの名無しさん:2009/07/21(火) 02:54:44
>>420

'Aの一番上の円盤がBの一番上の円盤より小さい'(A,B) :- A=[A1|_],B=[B1|_],A1 < B1.

'Aには現在載せられない'(A,B,C) :- A=[A1|_],B=[B1|_],C=[C1|_],A1 < B1,A1 < C1.

423 :デフォルトの名無しさん:2009/07/21(火) 06:21:32
>>420
本当に必要な述語はどんなものかという分析ができているのかどうか
ちょっと不安

424 :デフォルトの名無しさん:2009/07/21(火) 07:05:40
>>417
?- con2(1,[]).

これは?

425 :デフォルトの名無しさん:2009/07/21(火) 23:35:36
>>421さん
そのままのせてみたらエラーが出たのでcon2(A,[B|R]) :- A < B.
をcon2(A,[B|_]) :- A < B.としたらソースの読み込みはできたのですが
エラーが出てしまいました

>>422さん
それをいれて実行してみたら
Permission error: cannot redefine built_in ','とでてしまいました
(A,B) :- A=[A1|_],B=[B1|_],A1 < B1.の部分はまとめると
con2(A,[B|R]) :- A < B. となるのかなぁと思ったのですがどうでしょう?

>>423さん
なんかその通りなきがしてきました・・・。

>>424さん
申し訳ないです。そこまでは書いてなかったです

426 :デフォルトの名無しさん:2009/07/21(火) 23:40:33
>>425です連レスすいません
:- [search].

initial_state(hanoi, [[1,2,3],[],[]]).
goal_state(hanoi, [[],[],[1,2,3]]).

operator(hanoi, left_to_right(Disk), [[Disk|RestA], B, C], [RestA, B, [Disk|C]]) :-
con2(Disk, C).
operator(hanoi, left_to_center(Disk), [[Disk|RestA], B, C], [RestA, [Disk|B], C]) :-
con2(Disk, B). % 移動先で制約2を満たしていることをチェック
operator(hanoi,center_to_left(Disk), [A, [Disk|RestB], C], [[Disk|A], RestB, C]) :-
con2(Disk, A).
operator(hanoi, center_to_right(Disk), [A, [Disk|RestB], C], [A, RestB, [Disk|C]]) :-
con2(Disk, C).
operator(hanoi, center_to_center(Disk), [A, B,[Disk|RestC]], [A, [Disk|B], RestC]) :-
con2(Disk, B).
operator(hanoi, center_to_left(Disk), [A, B,[Disk|RestC]], [[Disk|A], B, RestC]) :-
con2(Disk, A).

%-- 制約2
% 一番上にあるディスクよりも、小さいことを検査
/* ?- con2(2, [1,3]).
?- con2(1, [2,3]).

ここまでは作ったんです制約のところは
con2(X,Y) :-X > Y,con2(X,[Y|_]).と最初作ってみたのですが
| ?- search(hanoi,S,G,P,A). と聞いてもnoと答えられたので詰まってしまいました・・・。

440 :デフォルトの名無しさん:2009/07/22(水) 21:19:40
一応紹介
http://www.sken.biz/~tsuchiya/prolog/text/sicstus.html
> 節内で他に共有されていない変数について、Prologが気をきかせて知らせてきています。
>
> 無名変数(_で始まる変数)にした方がよい場合もあるし、「変数名を書き間違えていた」という場合もあるでしょう。

ただし「(_で始まる変数)」は余計ですね

442 :デフォルトの名無しさん:2009/07/23(木) 00:29:35
>>440さん
[R] - singleton variables in user:con2/2
と出ているのでRは定義されてないよ??って言ってるんだと思うんですが
どうなんでしょう?

581 :デフォルトの名無しさん:2009/10/16(金) 16:25:27
http://pc12.2ch.net/test/read.cgi/tech/1254967587/486
の話ですが、こちらへ引っ越すことになりました。話の発端は
変数に情報をどこまで含ませられるか、コメントではだめなのか、でした。
A + B + C :- 売上入力検査(A,B,C,_診断), ... . と

_出荷日 + _商品番号 + _数量 :- 売上入力検査(_出荷日,_商品番号,_数量,_診断), ... .

の比較から、私が、
出荷日 A + 商品番号 B + 数量 C :- 売上入力検査(A,B,C,_診断), ... .

はPrologではできないので、としました。型出荷日のA、型商品番号のB、型数量のCが可能であるならば
_出荷日という蜻蛉のような表現よりは強いということです。
型について書いているのですが、私の視点は100%ソースコードの表現力に向けられていて、
コンパイラに於いて語られる諸問題とはほとんど無縁です。

582 :デフォルトの名無しさん:2009/10/16(金) 17:31:16
# 自分も「美しい言語」スレから、こちらへ引っ越してきました。

>>581
最終的に実現したい事は、Prologで(「データ型機能」を実現したい!と言うよりも、)
「名前付きフィールド機能」を実現したい!という事ではないかと推測します。
たとえばRubyのメソッド定義であれば、

 def 売上入力検査(出荷日, 商品番号, 数量) .... end

と記述する代わりに、ハッシュを使って

 def 売上入力検査(*入力データ) .... end

と記述し、そのメソッド呼び出しを以下のように記述する事が可能です。

 売上入力検査( '出荷日 => 20091016, '商品番号 => 200, '数量 => 36.4 )

これに類似した述語記述を、(更には、もし可能であれば言語レベルでの型定義/宣言/検査も)
Prologで実現したい!ということではないかと考えました。
SQL言語であれば、既にレコードとして実現されている機能ですから、
(RDBと比較して)Prologデータベースが使いづらい点だと思われます。

このような認識で合っているでしょうか?

583 :デフォルトの名無しさん:2009/10/16(金) 17:47:05
出荷日(A) + 商品番号(B) + 数量(C) :- 売上入力診断(A, B, C, _診断結果), …

だと順番が入れ替えられないのが問題なのかな?

584 :デフォルトの名無しさん:2009/10/16(金) 17:56:51
>>583
いや、インタプリタのトップから、
?- 20091016+200+34.6.
# 売上入力検査 true 売上 assertz(売上('20091016','0200',34.6,'2009-10-16 17:55:00.000000')) 済み
yes
?- というように使いたい。そのためには 出荷日(A) ではダメです。

585 :デフォルトの名無しさん:2009/10/16(金) 18:12:01
Prologを拡張して、
{A | 出荷日(A)} + {B | 商品番号(B)} + {C | 数量(C)} :-

のような表現を可能にすれば、?- 20091016+200+34.6.
は実現します。これは1980年代に中島秀之氏によって「項記述」という名で
Prolog拡張の提案として出されたことがあります。

586 :デフォルトの名無しさん:2009/10/16(金) 18:26:19
>>582
私の意図したのはどちらかというと、>>585の型そのものですが、
この { _変数 | _型記述 } の_型記述部分にatomがくると無条件に
真となる、と定義すれば「名前付きフィールド機能」らしきものには
なります。しかし、フィールド名からどうやって呼び出すのかという
問題を解決せねばならず理論的なアプローチが必要でしょう。

587 :582:2009/10/16(金) 18:27:58
>>584
>いや、

ということは、(>>582の)名前付きフィールドは不要であると考え、次の質問に移ります。

>いや、インタプリタのトップから、

インタプリタのトップレベルにこだわる理由は何かありますか?

たとえば、実行例を以下であるとし、

 ?- read_record.
 20091016+200+34.6. # <-- キーボードから入力
 yes
 ?-

とし、述語 read_record の中で 入力値検査と assert を実行した場合、
何が問題になりますか?

609 :デフォルトの名無しさん:2009/10/17(土) 18:23:09
Ozはマルチパラダイム言語であることくらいしか分かっていないけど、
問題解決の有効な一手法だと思う。その本は読んでいないけど、
おそらく並列論理型言語の問題は処理効率ではないかと想像。

ただ、論理型言語の魅力は、(処理効率を引き換えに得た)柔軟性と拡張性にあると考える。
だって、論理型言語の枠組みの中で、関係データベース、構文解析、関数、並行性、
制約解消、そしてオブジェクト指向を、次々と実現してきたんだから。
だから、プロトタイプやモデルシミュレーションといった、
処理効率の問題を無視できる用途であれば、
論理型言語(Prolog)は、まだまだ成長/発展を見込めるハズであると思う。

逆にマルチパラダイム言語は、魑魅魍魎というか混沌とした世界のように見える。
もちろんOzは触った事がないから、無知故の偏見だと思うが....。

612 :デフォルトの名無しさん:2009/10/19(月) 12:36:04
>>609
いや、指摘されてた問題点は、処理効率ではなくて、言語のモデルの方だった。
それに論理型の問題点じゃなくて、あくまで並列論理型の問題点だよ。
何かの問題では、モデルが悪くて上手く適用出来ないけど、
その原因は、並列論理型だと、並列性だったか、ストリームだったかが、自然に融合し過ぎていて操作対象として扱えないからという事だったようにと思う。

うっかりしてたけど、GHC??KL1をやってた上田教授(?)が、それをさらに発展(?)させた言語 LMNtal をやってたよ。
日本語以外も検索する指定で google で検索すると、pukiwiki で構築されてて、英語だけで、分子っぽい図があるページが見つかると思うけど、そこが LMNtal の本拠地みたいだ。
携帯からなんで URL が書けなくてゴメン。


820 :デフォルトの名無しさん:2011/07/18(月) 03:30:05.80
文字列としての出力がダメということ?
別にできたんだけど

$ swipl
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,928 bytes
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.2)
Copyright (c) 1990-2010 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- format("にほんご").
にほんご
true.


http://hibari.2ch.net/test/read.cgi/tech/1235561034/l50人気ブログランキングへ