【論理】Prolog【初心者】

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2010/11/06(土) 13:00:56
Prolog初心者のスレ

これは良い言語だ…
2013/02/22(金) 20:06:38.13
>>634
今、ラッセルやウィトゲンシュタインみたいな分析哲学に凝っているんだけど、
知識の記述に述語論理を使うという前提を共有しているのに、
人工言語派vs.日常言語派みたいな分裂が続くあたり、
何ともいえない不思議さを感じる。
2013/02/22(金) 20:35:52.78
東アジアの農民は、10000年もゆったりした言語で特に深刻に悩むでもなく、
自然と共存したり、痛い目に遭わされながらつぶやいてきた。その延長の言語で
あってよいから、もう少しだけ自分が生きた証しをくっきりとできればいい。
言語に内在するほんの少しの論理性の助けを借りて。だから論理プログラミング。
その程度の論理プログラミング。
2013/02/23(土) 16:24:36.29
論理性の無い文章だなぁ
2013/03/08(金) 23:47:28.33
Prologでシークエント計算できますか?
2013/03/09(土) 14:22:50.10
できるけど、50行くらいプログラミングが必要
2013/03/19(火) 05:22:51.00
wa(you, shock).
2013/03/20(水) 14:52:27.58
prologのバックトラックを使って
深さ優先探索のミニマックス戦略のプログラムを作れますか。
やむをえなければassert,retractを使ってもかまいません。
幅優先探索ならできるのですが。
2013/03/20(水) 17:44:36.54
>>646
こんな定義になると思う。未定義の部分が多いけれどそのうちに書く。

n手先を評価する(_n,_局面1,_着手ならび,_評価点,_局面) :-
    length(Ln,_n),
    手を読む(Ln,自分,_局面,[],[],_着手ならび,_評価点,_局面).

手を読む([],_,_局面,_着手ならび,_評価ならび,_着手ならび,_評価点,_局面) :-
    sum(_評価ならび,_評価点),!.
手を読む([_|Ln],自分,_局面1,_着手ならび1,_評価ならび1,_着手ならび,_評価点,_局面) :-
    findmax([_評価,_着手,_局面2],(
          着手(_局面1,_局面2,_着手,評価)),
        [_評価,_着手,_局面2]),
    手を読む(Ln,相手,_局面2,[_着手|_着手ならび1],[_評価|_評価ならび1],_着手ならび,_評価点,_局面).
手を読む([_|Ln],相手,_局面1,_着手ならび1,_評価ならび1,_着手ならび,_評価点,_局面) :-
    findmin([_評価,_着手,_局面2],(
          着手(_局面1,_局面2,_着手,評価)),
        [_評価,_着手,_局面2]),
    手を読む(Ln,自分,_局面2,[_着手|_着手ならび1],[_評価|_評価ならび1],_着手ならび,_評価点,_局面).

着手(_局面1,_局面2,_着手,_評価) :-
    着手の選択(_局面1,_局面2,_着手),
    局面の評価(_局面2,_評価).
648647
垢版 |
2013/03/20(水) 18:04:57.94
そうか。
これだと、最善手をn手続けてみただけか。
一手目を非決定性に着手してn手先まで最善手で読ませて、すべての着手を
評価して、評価点がもっとも高い着手を選ぶようにしないといけないか。
2013/03/20(水) 18:25:18.12
>>647,648
深さ優先ですから、とりあえずある道筋で、最終局面まで行き、
そこで評価点を決め、それをひとつ下のレベルに下ろしておいて、
また別の最終局面に行って評価点を求め、其れを先ほどの値と比較し、
最終局面がなくなったら更に一つ下のレベルと比較......
のようなことを繰り返し、次第にレベルを下げていくことになるはずですが、
バックトラックをうまく制御できません。
650647
垢版 |
2013/03/20(水) 18:45:14.17
>>649
深さ優先といっても株は全部評価しないとどれが最高評価点かが
分かりません。それで最高点-最低点-最高点...と降りていって、
葉までたどり着いたら(つまりn手先)一つ候補が決まる。次善候補を
葉のレベルの次の評価点の候補着手とするという意味ですか?
2013/03/20(水) 19:12:35.16
>>650
理屈からいうと、N手目の局面で評価するとすると、
あるN-1手目から派生するN手目の評価点を全て比較して、
其れをN-1手目の評価点とし、同様にあるN-2手目から派生する
全てのN-1手目について評価点を決めて其れを比較して
N-2手目の評価点として........というように、
だんだん一手目まで戻っていきます。
(もちろんmini とmax交互に)
これを、同じレベルの評価をfindall等を使っていっぺんに行うと
幅優先になり、行ったりきたりして評価すると深さ優先になります。
1->N->N-1->N->N-1->N->N-1->N-2->N-1->N->N-1->N->N-1->N-2........
というような感じだと思います。.
2013/03/20(水) 21:31:55.30
着手の選択/4と局面評価/2が未定義ですが、

http://nojiriko.asia/prolog/mini_max_senryaku.html

のようなコードでしょうか。
2013/03/20(水) 23:01:45.80
>>652
初心者ですので、他人のコードを読むのは難しいのですが、
これは基本的に幅優先のコードではないでしょうか。
2013/03/21(木) 00:23:36.01
>>653
何か間違っていますね。 ! を削りましょう。そうすると、

着手候補の取り出し(_枝切り,_評価_着手_局面ならび_2,_評価,_着手,_局面2) :-
    length(L0,_枝切り),
    append(L0,_,_評価_着手_局面ならび_2),
    member([_評価,_着手,_局面2],L0).

の最後memberが働いて、全解を取り出せると思います。

3手先読みの最善手は -> 次の可能な全ての手を評価して整列 ->
探索範囲を狭めるため枝切り -> 最も評価の高い手を選択 ->
相手の立場から最も評価高い手を選択 ->
その局面で全ての可能な着手を評価し -> 整列して枝切り ->
これで第一解が得られる
バックトラックすると、
3手先読みの整列枝切り後も member/2 の次の候補が取り出されて第二解。

findmax で次々呼び出されて、最高評価点を探す。
2013/03/21(木) 00:55:51.96
>>654
これ深さ優先でしょうか。
幅優先のような気がしてなりません。
2013/03/21(木) 01:29:24.35
その人、悪い人じゃないんだけど、ちょっとおかしいところあるから、あまり関わらないほうがいいよ。
2013/03/21(木) 06:29:01.79
>>655
Wikipedia の幅優先の項のグラフを借用して説明します。
http://ja.wikipedia.org/wiki/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2

       1

   2  3  4

 5  6   7   8

9 10       11 12

プログラムでは、着手評価が唯一の実効のある作用なので、着手評価によって
横方向の優先順位を決めることが幅優先に見えることは仕方ない。
[2,3,4],[5,6],[7,8],[11,12]の順序は実は動的に決められます。

しかし、実際の手の読む順序は
1 - 2 - 5 - 9  が第一解
1 - 2 - 5 - 10 が第二解
1 - 2 - 6    が第三解

のように、このノードが先に優先して評価されていきます。2-5-9,10を評価して
いる時には7,8,11,12などは置いてきぼりの状態にあります。
これは幅優先ではありません。
658657
垢版 |
2013/03/21(木) 06:31:38.99
実際の手の読まれる順序 ですね。
2013/03/21(木) 10:44:06.29
>>657
私の求めていたアルゴリズムとは違うようですが、
これはこれで興味深いですので、何とか解読してみたいと思います。
ありがとうございました。
2013/03/21(木) 21:35:47.92
大学で習ったから家でもやろうかと思い立ったが、やっぱり個人で無料の場合はswi-prologなのだろうか
ちなみに大学は有料の処理系つかってたみたい
2013/03/21(木) 23:37:50.17
教官とそのソフトの業者がつるんでるんだろうな。
でなきゃ、Prologとして十分な機能を備えているswi-prologを避ける理由が分からん。
2013/03/22(金) 07:06:47.14
>>661
ずっと以前のバージョンで日本語に不具合があったから、
というようなことが理由になっている場合が多いと思います。
663デフォルトの名無しさん
垢版 |
2013/04/02(火) 13:57:47.80
macでgnu prologやってみたいのですが、「gprolog-1.4.3.tar.gz.」をダウンロードしてからが
分かりません、どなたか教えていただけませんか
2013/04/02(火) 21:34:37.35
GNU is Need Unix
2013/04/03(水) 01:00:09.38
>663
まさか解凍できないという話ではないでしょうね
2013/04/03(水) 01:09:29.27
xcodeとコマンドラインツールズとhomebrewもいれららない世の中じゃ、ポイズン。
2013/04/03(水) 21:02:14.22
ははあ、LC475かな。FPUというのがあってですね。
2013/04/03(水) 22:00:36.89
Macportもどうぞ
2013/05/18(土) 18:33:05.23
【論理力テスト】次の文章は正しいようで実は論理的に間違っています。どこがどうおかしいか貴方は説明できますか→「何度学校を変わってもいじめられるのは、いじめられる側に原因がある証拠だ」…答えは「感情自己責任論」で検索
2013/05/18(土) 21:27:03.74
>>669
検索したが分からなかった。
あなた説明して。

∀Student[∀School{bullied(Student,School)→caused(Student)}]
全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。

もしかして、反証可能な命題の提示ではあるが論理的な証明ではないとか言えば良い?
671670
垢版 |
2013/05/18(土) 21:45:08.12
違うか。

> ∀Student[∀School{bullied(Student,School)→caused(Student)}]
> 全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。

∀Student[∀School{(enroll(Student,School)∧bullied(Student,School))→caused(Student)}]
全ての生徒について、その生徒が在学したあらゆる学校で虐められるならばその生徒に原因がある。
2013/05/19(日) 13:06:01.33
SWI-Prologって64bit版が出ていたのですね。
知らなかったが,Windows 7の64bit版に
今日インストールして使いはじめました。
気のせいか,処理速度がすこし速くなったよう
に思います。
2013/05/19(日) 20:15:05.45
Bratko さんの Prolog 本(新版)の日本語版はでないのでしょうか
…原書の自炊ミスって単語一個分余計に切り落してしまい絶望中
2013/05/20(月) 23:47:35.64
SWI-Prologの64bit版をインストールしたのだけれど
SWI-Prolog-Editorと相性が悪いらしく,
configurationのProlog folderに64bit版のフォルダーを
していして,プログラムを書いてconsult.を押しても,
prologプログラムが見当たらないというエラーメッセージ
がでる。
しかたがないので,32bit版もインストールしてそちら
のホルダーを指定して使っている。
64bit版でSWI-Prolog-Editorを同期して使っている方
が居られましたら,どうすべきかご教授いただけると
ありがたいです。
2013/06/14(金) 12:50:56.41
prologで作られたアプリケーションやライブラリのリンク集みたいなものはないのでしょうか

prologで型推論エンジンつくろうと思ってるのですが
多分だれか既に作った人いないわけないので
どこかで公開していないかと
2013/06/15(土) 00:25:36.27
arXivで検索検索
2013/06/17(月) 19:15:02.01
>>675
http://rainyday.blog.so-net.ne.jp/2008-06-16

ここにPrologで書いたとても簡潔な型推論コードがある
2013/07/05(金) NY:AN:NY.AN
量子コンピュータが実用化されたら Prolog 大活躍するん?
2013/07/05(金) NY:AN:NY.AN
>>678
むしろPrologが必要なくなる方向を予想する
2013/07/05(金) NY:AN:NY.AN
>>679
Prologの連言が量子コンピュータ上では通じなくなるなんて
ことがあるかなぁ。
2013/07/05(金) NY:AN:NY.AN
>>680
というか、すべての計算を探索に還元するんだから、わざわざPrologで設計する必要がないというか
2013/07/05(金) NY:AN:NY.AN
>>681
そういう意味での探索は実は現在のPrologにとって苦手。
遅かったり、スタックオーバーフローが起きたり。
ここの部分がアセンブラ化することはPrologにとって
御の字ではなかろうか。
2013/07/05(金) NY:AN:NY.AN
量子コンピュータが実現しても、KL/1でやってることががprologのコードで書けるようになるというイメージしかない
2013/07/05(金) NY:AN:NY.AN
Prologがやるべきことは、人間にとって寧ろ需要な
表層の知を確認する作業。要するにシンボル操作だから、
量子コンピュータとは直接的な繋がりはないかも。
2013/07/06(土) NY:AN:NY.AN
SWI prologです

ex.pl というファイルを

?- X is 3,X > 0.
?- append([1,2,3],[4],X),print(X),write(X).

以上のような中身とし、
コンソールで [ex]. とうつと


902 ?- [ex].
aaa+[1,2,3,4]
% ex compiled 0.00 sec, 1 clauses
true.

のようになるんですが、これをコンソールで逐一手で入力したのと同様に、下記のように変数の同定結果まで出力させるにはどうしたらよいでしょうか?

903 ?- X is 3,X > 0.
X = 3.

904 ?- append([1,2,3],[4],X),print('aaa'+ X).
aaa+[1,2,3,4]
X = [1, 2, 3, 4].
2013/09/01(日) 19:13:48.36
swipl-win.exeで、日本語を入力したときにカーソル位置がズレるのですが、何か良い手はないでしょうか?
version 6.4.1 (windows 64bit)版です。
2013/09/01(日) 20:41:43.53
emacsのシェルモードで試してみてはどうか
2013/09/01(日) 21:52:09.09
windowsなので、emacsは入れたくないです。cygwinインストールが必須らしいので。
サクラエディタ上で使えたらよいのですが、うまくいきません。
2013/09/01(日) 21:56:08.08
>>688
emacsもmeadowもcygwin無しでOKのwindows版あるよ
2013/09/01(日) 22:23:09.77
ありがとうございます。試しにMeadow入れてみました。
M-x shellでシェルモードにして、その中でswipl.exeを実行してみましたが、
プロンプトが表示されないなど、満足に動作しませんでした。
2013/09/07(土) 16:18:13.90
日本語対応が十分にできるている処理系はありますか?
2013/09/12(木) 18:45:07.45
Prologで仕様記述できますか?
2013/09/12(木) 19:42:43.95
>>692
ルールを決めればできるでしょう。
2013/09/28(土) 12:48:49.81
Prologで2つの値が等しいと(ポインター)アドレスが等しいは区別されていますか?
Lispのeq? equal?の違いみたいなものです
2013/09/28(土) 16:58:44.30
>>694

?- X = Y, X == Y.
X = Y.

?-
区別されませんね。
2013/09/30(月) 16:49:29.65
X =:= Y.
697デフォルトの名無しさん
垢版 |
2013/10/02(水) 13:46:42.08
>>692
そこで言ってる仕様記述ってどういう意味のですか?
2013/10/20(日) 04:46:24.01
PrologにはstalinやMLtonみたいな
超高速コンパイラってありますか?
2013/10/20(日) 17:54:10.52
ICOTでいろいろ量産されてた気がする
700デフォルトの名無しさん
垢版 |
2013/10/21(月) 09:21:25.23
いつのまにかEclipseでPrologが書けるようになってた
便利だ・・・
701デフォルトの名無しさん
垢版 |
2013/10/23(水) 10:06:56.32
Prologで常識的には
ある文章の中の名詞なり動詞なりなにを関数にするもんなでしょう?
2013/10/23(水) 11:23:06.63
>>701
対象となっている、物、事、性質、動作、行為、状態、これらの複合したもの、
文章。何がきてもよいのではないですか。述語論理だから、述語、すなわち、
動詞句や形容詞等が来なくてはならないということはありません。
2013/10/23(水) 19:36:57.16
>>701
手続き的な例ですが、こんなのもあります。
http://nojiriko.asia/prolog/j72_815.html
2013/10/24(木) 11:33:03.43
>>702
PrologってJavaのメソッドのような意味での関数でなくMapやListのようにも
振る舞うみたいなので作法があるのかと思ってました
関連付けって思えばいいんですかね?

>>703
わかりやすいです
ありがとうございます
2013/10/27(日) 06:57:07.73
東京キャビネットみたいな
高速で検索できるデータベースの中を
Prologの命題で検索できないのでしょうか

MySQLは,それっぽいのみつけたので
既にあるのかもしれないですが
706デフォルトの名無しさん
垢版 |
2013/10/27(日) 09:25:23.92
Prologで文法のサイトはよく見るんだが
VSのプロジェクトのような作り方ってPrologできるのん?
2013/12/17(火) 10:57:32.78
swi-prologが標準みたいだけど
swi-prologが一番使われてる理由って何故ですか?
swi-prologじゃなくて2番手みたいな処理系ってないのですか?
2013/12/17(火) 11:59:17.93
>>707
SWIは開発が活発で
組み込みやライブラリ、
ドキュメントが一番充実してる
教育や研究目的には向いてると思う

機能重視ならSWI
速度重視ならYAPやGNU Prologなどもオススメ
2013/12/18(水) 12:46:39.18
>>707
>>708に、日本語が十分満足に使えることを条件に加えると、
機能の SWI-Prolog 速度の AZ-Prolog でよいと思う。
2013/12/19(木) 08:47:57.77
PrologをSQLに変換するコンパイラなんてのをみつけた
Prologの構文って全部SQLに変換できるのだろうか
2013/12/20(金) 17:55:44.14
prologは演繹データベースだから、prolog -> SQL は難しい
SQL -> prolog なら大学の演習レベルでもなんとかなると思う
2013/12/20(金) 18:58:22.89
>>711
そうですね。単位節データベースの参照の後に延々とルールが来て、
それでデータベースのフィールド参照のキーが漸く来るなんてことも
有りえます。そういう場合は、selectを参照する条件としてそれらを
型推論的な先読みをしたとしても、拾ってくるのはかなり難しいです。
2014/02/24(月) 00:48:00.61
RDFのデータベースを検索するSQLの親戚あるけど
あれならPrologと一対一で変換できそう
2014/03/09(日) 15:32:00.41
SWI-Prologを使っているんだけどユニファイ可能な節が1つ以上存在するかを判定する組み込み述語ってある?

今はfindallした結果のリストの長さが0以上かで判定してる…
2014/03/09(日) 16:10:50.90
>>714
存在するか否かを判定するだけなら、単に質問すればいいのでは?
なぜわざわざfindallする必要があるのだろうか....
2014/03/09(日) 18:25:03.73
いい女ぴー?
やらしてくれるぴー?
2014/03/16(日) 21:00:44.77ID:8VpQ5LoV
>>714
ユーザ定義述語であることが条件だが、findall/3とclause/2を使うのが普通だと思う。

ユニファイ可能な節が1つ以上存在するかを判定する(Head) :- findall(_,clause(Head,Body),[_|_]).
718デフォルトの名無しさん
垢版 |
2014/04/09(水) 21:24:27.23ID:i/ZHdrIw
>>717
findall/3を使わないと少なくとも幾つあるかはわからない。
2014/06/05(木) 12:16:15.58ID:JLFuk7Df
generate(C) :-
random_between(65, 90, I),
atom_char(C, I).

experiment('STAP', Count) :- !,
writef('%w回目で陽性かくにん!¥nよかった☆¥n', [Count]).

experiment(_, Count) :-
generate(S),
generate(T),
generate(A),
generate(P),
atomic_list_concat([S, T, A, P], CELL),
writef('%w細胞', [CELL]),
NextCount is Count + 1,
experiment(CELL, NextCount).

main :-
experiment([], 0).

もっと面白い書き方ないかな?
2014/06/05(木) 19:08:53.35ID:h2Dia7Mk
% 特に改善されたという訳ではない。

generate(CELL) :-
  findall(A,(
        between(1,4,_),
        N is random(26),
        sub_atom('ABCDEFGHIJKLMNOPQRSTUVWXYZ',N,1,_,A)),
      L),
  atomic_list_concat(L,CELL).

main :-
  nth1(Count,_,_),
  generate(CELL),
  writef('%w細胞', [CELL]),
  CELL = 'STAP',
  writef('%w回目で陽性かくにん!\nよかった☆\n', [Count]).
2014/06/05(木) 19:35:36.06ID:h2Dia7Mk
>>720
mainの最後に ! を入れて置かないと、バックトラックされるとCountが累計されていって、
いつかnth1/3が原因でスタックオーバーフローになるかも知れない。
2014/06/05(木) 23:17:35.42ID:awAmNJBx
STAP細胞でコードゴルフでもするかね
2014/06/06(金) 00:01:25.80ID:Ynv3Q/53
g(C):- findall(I,(between(0,3,_),random_between(65,90,I)),C).
e([83,84,65,80],N):-!, format('~w回目で陽性かくにん!¥nよかった☆¥n',[N]).
e(_, N):- g(C), format('~c~c~c~c細胞', C), N1 is N+1, e(C, N1).
main:-e([], 0).

$ wc stap.pl
3 16 233 stap.pl
$ swipl -q -t main -f stap.prolog

ドヤ!
2014/06/06(金) 00:03:45.32ID:Ynv3Q/53
g(C):-findall(I,(between(0,3,_),random_between(65,90,I)),C).
e([83,84,65,80],N):-!,format('~w回目で陽性かくにん!¥nよかった☆¥n',[N]).
e(_,N):-g(C),format('~c~c~c~c細胞',C),N1 is N+1,e(C,N1).
main:-e([],0).

$ wc -c stap.pl
223 stap.pl
$ swipl -q -t main -f stap.pl
スペースつめるの忘れてた
2014/06/06(金) 00:52:39.27ID:Ynv3Q/53
g(C):-findall(I,(between(0,3,_),random(65,91,I)),C).
e([83,84,65,80],N):-!,format('~w回目で陽性かくにん!¥nよかった☆¥n',N).
e(_,N):-g(C),format('~c~c~c~c細胞',C),O is N+1,e(C,O).
m:-e(0,0).

$ wc -c stap.pl
207 stap.pl
swipl -q -t m -f stap.pl

もうだめだ寝る
726片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0
垢版 |
2014/06/30(月) 22:35:30.71ID:CGk8SAom
古典的な人工知能の研究をしています片山博文MZです。
最近Prologの重要性がわかるようになってきました。
PrologからC言語の関数を呼ぶ方法と、C言語からPrologを扱う方法を教えて下さい。
2014/07/01(火) 00:10:07.68ID:8cxNwtXU
>>726
http://www.swi-prolog.org/pldoc/man?section=foreign

片山氏なら、C言語や英語の知識を前提にしても問題無いよね
2014/07/01(火) 00:12:40.61ID:/dpi9Kd/
ありがとうございます。
2014/07/12(土) 22:10:17.18ID:x0cGe7WX
swi-prologを使ってるんだけどassertした節を自動的にファイルに保存するようにはできないのかな
assertする度にlistingで書き出してバックアップとるのめんどくさそうだし効率わるそう
2014/07/12(土) 22:56:26.14ID:ktHPdOby
>>729
at_halt/1 を使うと、システム終了時に実行するフック述語を登録できる
もしファイルを tell/1, listing/0, told/0 する述語を登録すれば ....
731デフォルトの名無しさん
垢版 |
2014/07/23(水) 04:59:03.99ID:W7WkvjfP
prologでGAを実装するのには他の言語(Java)で実装するより何が優れている?
2014/07/23(水) 18:41:02.31ID:Ricx3ybR
カットを使った多様性の表現のし易さ
2014/07/24(木) 01:48:04.69ID:Zh2B/axR
GAにおいてとくにPrologが優れてる点は思いつかないけど、
Javaは冗長でほんと疲れる

Prologなら

member(1,L).
で済むところが、Java だと

List<Integer> list = new LinkedList<Integer>();
list.add(1);
になるからな。
GAだって銀行の勘定系だって、Prologなら半ページで書ける
2014/07/24(木) 03:43:43.10ID:1HIq9M5v
Prologこそ冗長の極みでそw
2014/07/24(木) 09:11:30.92ID:URujTxoj
>>734

http://peace.2ch.net/test/read.cgi/tech/1402622093/569
2014/08/17(日) 15:56:42.59ID:8ylmIV1H
prolog覚えたいんですけど、何かいい方法はありますか?
Cやvba、php、あとcssなど触ってきましたが、やや特殊な感じがしてなかなか覚えることが出来ません…
習うより慣れろ、でしょうか
2014/08/17(日) 16:35:59.06ID:XkL8f3FM
まずは手続き型プログラミングの延長で考えよう
たとえば値 x とy の最大値を求める関数 max(x, y) を疑似コードで書くと:
 max(x, y) = if x > y then z := x else z := y; return z
これを Prolog では:
 max(X, Y, Z) ;- X > Y, !, Z = X.
 max(_, Y, Z) ;- Z = Y.
と書けるけど、一般にはより簡潔に以下のように書く:
 max(X, Y, X) ;- X > Y, !.
 max(_, Y, Y).
ここで、カット "!" は条件式と以降の文との間に置く "then" と見る

ここまでは(手続き型における)「分岐」のパターンになるけど、
手続き型の「反復」を Prolog では「再帰」で書くから、
「再帰の書き方(=再帰的定義)」に慣れることが最初の壁になる
たとえば数のリストについて、各値を +1 する述語 list_succ は:
 list_succ([X|XS], [Y|YS]) ;- Y is X + 1, !, list_succ(XS, YS).
 list_succ([], []).
と書き、同様に偶数だけを抽出する述語は:
 list_even([X|XS], [X|YS]) ;- is_even(X), !, list_even(XS, YS).
 list_even([_|XS], YS) ;- list_even(XS, YS).
 list_even([], []).

こういった手続き型プログラミングと共通する概念とその書き方に慣れてから、
Ptolog 固有の「単一化」や「バックトラッキング」といった概念を学ぶといい
2014/08/17(日) 17:01:36.81ID:XkL8f3FM
>>737 のコード中にある ;- は :- のタイプミスなので訂正
2014/08/17(日) 20:16:33.99ID:3mYBlI6x
8/22(金)10:30〜
放送大学集中放送授業期間
『記号論理学('14)』

というのがある。
オススメというよりも自分が楽しみにしているのだけど。
2014/08/18(月) 20:04:08.48ID:5sINgTuF
>>737
ありがとうございます。
ガンバルゾーッ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況