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

Prologの宿題片付けます 第二編

1 :?- :2012/10/22(月) 17:13:22.94 .net
Prologの宿題あるいは演習の課題を掲載して、ソースプログラムを
書く契機を作るスレです。大学等でどんなProlog教育が試みられて
いるかを知る機会にもしたいと思います。

[1] 課題は # から始まる行表現でお願いします。それでソースコードと区別します。
[2] できるだけインデント表現になるように工夫してください。
[3] コードの途中または後での質問は % から始まるコメントの形式を取ってください。
[4] Prologは一つ仕様から多様なプログラム表現が生まれる言語です。先に答えを
書かれてしまっても、別の正解は無限といってよいほどあります。少しでも、味のある
部分を見つけたらどしどし上げてみましょう。


28 :デフォルトの名無しさん:2012/10/24(水) 14:46:07.35 .net
>>9
http://nojiriko.asia/prolog/c141_323_1.html



29 :デフォルトの名無しさん:2012/10/24(水) 15:15:01.06 .net
>>28
いかにもPrologらしいプログラムだな。

30 :デフォルトの名無しさん:2012/10/24(水) 16:16:29.49 .net
# 10分程前にtwitter上に問題として出したもの。
#
# 問題: 「目に遮り、形あるものは切り給まふべくが、もし、無形の陰鬼陽魔亡霊は
#     何を以って切り給まふや」 --勧進帳--
# この台詞は富樫が弁慶を問い詰めた難問ですが、弁慶の答を調べ
# Prolog述語として定義した上で、質問してみてください。
#


31 :デフォルトの名無しさん:2012/10/25(木) 08:09:35.39 .net
>>16
http://nojiriko.asia/prolog/prolog2_16_2.html

32 : 忍法帖【Lv=2,xxxP】(2+0:5) :2012/10/26(金) 08:34:51.76 .net
>>30
結構難しいねw

33 : 忍法帖【Lv=4,xxxP】(2+0:5) :2012/10/31(水) 10:35:15.99 .net
>>22
Prologの述語定義で、情報の出所も別に述語定義するべきかな?

34 :デフォルトの名無しさん:2012/10/31(水) 12:56:25.79 .net
>>33
Prologの述語定義の場合、著作物に極めて近い表記が現れる
可能性があるという意味かな。


35 : 忍法帖【Lv=4,xxxP】(1+0:5) :2012/10/31(水) 13:12:21.50 .net
>>22 のようなものだって、マニアは暗記していたとしても、自分で
メジャー持って測って回った人はほとんどいなかった。
しかし、今では、Webサイトでメートル単位で測ることができる。この例
からも現在の情報源は極めて多様で、一筋縄ではいかない問題だと言える。

36 : 忍法帖【Lv=7,xxxP】(1+0:5) :2012/11/08(木) 18:17:49.76 .net
切り給まふべく(X) :- 目に遮り(X),形ある(X).

% なのかなぁ。どうもよく分からない。

37 : 忍法帖【Lv=7,xxxP】(1+0:5) :2012/11/09(金) 08:22:36.80 .net
% 無形の陰鬼陽魔亡霊は九字真言を以って之を切断せむに何の難きことやあらん

切断せむに易し(剣,_之) :- 目に遮り(_之).
切断せむに易し(剣,_之) :- 形ある(_之).
切断せむに易し(九字真言,_之) :- 無形(_之),(陰鬼(_之);陽魔(_之),亡霊(_之)).

% 「切断せむに何の難きことやあらん」をどう記述してよいかわかりません。

38 :デフォルトの名無しさん:2012/11/09(金) 08:27:06.22 .net
>>37
切断せむに易し(九字真言,_之) :- 無形(_之),(陰鬼(_之);陽魔(_之);亡霊(_之)).

でしょ。

39 :デフォルトの名無しさん:2012/11/09(金) 08:33:23.17 .net
句を述語にする方法では重文が苦しいね

40 : 忍法帖【Lv=7,xxxP】(1+0:5) :2012/11/09(金) 08:51:14.00 .net
>>39
切断せむに易し(九字真言,陽魔).

のように定義するものだろうか。無形であって陽魔とでも呼ぶしかないものと
いうニュアンスが出ないけど。

41 :デフォルトの名無しさん:2012/11/09(金) 19:47:10.89 .net
一階述語論理だからなあ。
文構造全体を構造項で表すしかないのではないか。

42 :デフォルトの名無しさん:2012/12/21(金) 20:16:48.85 .net
Prologで書いた詰将棋の例ってどこかに
アップしてありますか。
ググってみたのですが、見つからないもので
御存じのかたがいらっしゃったらご教示ください

43 :デフォルトの名無しさん:2013/10/03(木) 16:01:04.89 .net
一つの述語が非常に長くなって、
その述語の中ではバックトラックする部分があってもバックトラックが必要ないとする。
この場合、その述語にカットを大量に入れることは処理効率向上に寄与するか。
という問題にぶちあたったのですが。
カットはどの程度入れればいいのか目安をお願いします。

44 :デフォルトの名無しさん:2013/10/03(木) 17:56:07.58 .net
>>43
述語は出来る限り分割する方がよい。言い換え、言い換え、また言い換えて。
ひたすら言い換える。
一つの述語の本体の副目標数の総計を四つか五つくらいに抑えるように。
append([],L,L).
append([U|X],Y,[U|Z]) :- append(X,Y,Z).
の本体の副目標は第一節の :- true. が省略されていると考えて、二つである。
こうした上で、カットをどうするか。これなら見通しがたつだろう。

45 :デフォルトの名無しさん:2013/10/04(金) 17:21:23.24 .net
p :- p1,p2,p3,p4,(p5,p6,p7;p8,p9,p10,p11,p12). だとすると、例えば、
p :- q1,q2,q3. のようなまとめ方をする。
q1 :- p1,p2.
q2 :- p3,p4.
q3 :- p5,p6,p7.
q3 :- q4,q5.
q4 :- p8,p9.
q5 :- p10,p11,p12.

46 :デフォルトの名無しさん:2013/10/05(土) 03:29:22.37 .net
逆にq系列の述語名を使わずに、すべて長い述語名で定義するとしたら、
'p1,p2,p3,p4,(p5,p6,p7;p8,p9,p10,p11,p12' :-
 'p1,p2','p3,p4','(p5,p6,p7:p8,p9,p10,p11,p12)'.
'p1,p2' :- p1,p2.
'p3,p4' :- p3,p4.
'(p5,p6,p7;p8,p9,p10,p11,p12)' :- 'p5,p6,p7'.
'(p5,p6,p7;p8,p9,p10,p11,p12)' :- 'p8,p9','p10,p11,p12'.
'p5,p6,p7' :- p5,p6,p7.
'p8,p9' :- p8,p9.
'p10,p11,p12' :- p10,p11,p12.

47 :デフォルトの名無しさん:2013/10/05(土) 03:41:42.68 .net
実際には、最終行の
'p10,p11,p12' :- p10,p11,p12. は例えば、以下のようなことになる。

'トランザクションファイルを開き,マスターファイルを更新し,トランザクションファイルを閉じる' :-
 'トランザクションファイルを開き',
 'マスターファイルを更新し',
 'トランザクションファイルを閉じる'.

48 :46:2013/10/05(土) 06:35:42.86 .net
>>46 二行目訂正 ) が一つ落ちていた。
'p1,p2,p3,p4,(p5,p6,p7;p8,p9,p10,p11,p12)' :-

49 :デフォルトの名無しさん:2013/10/05(土) 12:49:57.28 .net
カットについて大事な点は、p6とp7に間に!があるとして、
p :- p1,p2,p3,p4,(p5,p6,!,p7;p8,p9,p10,p11,p12). と

p :- q1,q2,q3.
 ・・・
q3 :- p5,p6,!,p7.
q3 :- q4,q5.
 ・・・
のp6とp7の間の!の意味(影響範囲)は全く異なるということですね。

50 :デフォルトの名無しさん:2014/04/09(水) 05:37:54.10 ID:i/ZHdrIw.net
>>10
すみません。これ「最多」ではなかったでしたね。三番目かな。

51 :デフォルトの名無しさん:2014/06/16(月) 08:31:25.58 ID:rWx9LAWU.net
>>51
「ほとんどない。」ではなくて、「滅多にお目にかかれない。」に変えて読んでください。

52 :デフォルトの名無しさん:2014/06/22(日) 15:52:02.46 ID:l+hcNyaT.net
>>51
ウンコジャップが使う日本のイントラネットには糞資料しかないけれど、
海外には、そこそこの資料が沢山あるよ。

53 :デフォルトの名無しさん:2014/06/22(日) 15:53:47.04 ID:l+hcNyaT.net
日本でディプロマミルを発酵している糞教授たちは、給料で何をしているんだろうね。

54 :デフォルトの名無しさん:2015/07/27(月) 07:21:24.39 ID:3t1g+BY6.net
Cの関数とかC++やJavaのクラスみたいな
モジュール化ってPrologではどうやってしますか?
コードの量が増えてきたら分けたほうが良いと思うのですが

55 :デフォルトの名無しさん:2015/08/10(月) 07:36:49.09 ID:bjBPE/iS.net
>>54 モジュール宣言をします。

:- module(quick_sort).

のように。
そうすると partition/4 のような述語の意味を限定できます。

56 :デフォルトの名無しさん:2015/08/10(月) 12:12:04.63 ID:ihjRZmh2.net
>>55
レスありがとうございます。
なるほど、そのままの宣言があったのですね。

57 :デフォルトの名無しさん:2016/03/25(金) 13:31:43.53 ID:ARxGxflV.net
>>10 最多は西行法師ですね。

58 :デフォルトの名無しさん:2016/11/23(水) 12:08:40.01 ID:SFuJBFAB.net
>>34
昨日ツイッターにDCG節を使ったPPAPのプログラムの載っているサイトが紹介されていたが、
あのプログラムは、歌詞が全部そのまま述語になっているから、著作権の問題が常に付き纏う
ことになる。出典を別に述語定義しただけで十分と言えるかどうか。

59 :デフォルトの名無しさん:2017/01/22(日) 10:58:01.57 ID:ct1KzJlV.net
# ここではアトムを文字列と呼ぶことにする。
# 文字列の現れる二個目のCの文字列の最初の文字から一文字前までの副文字列と
# 一文字後から末尾までの副文字列を求める述語を定義しなさい。

60 :デフォルトの名無しさん:2017/01/23(月) 05:00:52.72 ID:ldBFD7Ci.net
>>59

'文字列に現れる二個目のCの
文字列の最初の文字から一文字前までの副文字列と
一文字後から末尾までの副文字列'(_文字列,_前方副文字列,_後方副文字列) :-
文字列に現れるCの前方副文字列と後方副文字列(_文字列,_前方副文字列,_後方副文字列),
前方副文字列には既にCが現れている(_前方副文字列),!.

文字列に現れるCの前方副文字列と後方副文字列(_文字列,_前方副文字列,_後方副文字列) :-
atom_concat(_前方副文字列,_残り文字列,_文字列),
atom_concat('C',_後方副文字列,_残り文字列).

前方副文字列には既にCが現れている(_前方副文字列) :-
sub_atom(_前方副文字列,_,1,_,_前方副文字列).

61 :61:2017/01/23(月) 05:03:15.03 ID:ldBFD7Ci.net
% 間違い。最後二行訂正。

前方副文字列には既にCが現れている(_前方副文字列) :-
sub_atom(_前方副文字列,_,1,_,'C').

62 :デフォルトの名無しさん:2017/01/23(月) 07:53:01.03 ID:ldBFD7Ci.net
要は、
atom_concat/2 を二つ連ねると、文字列を三つの部分に分解できる。
そうしておいて、対象文字列(ここではCという文字)の前方または後方を参照する。

63 :デフォルトの名無しさん:2017/01/23(月) 18:47:40.02 ID:uB7NxMna.net
# 5匹の羊と5匹の狼を1匹ずつひとつの檻に入れる。
# 羊の数を狼の数が超えると羊が食べられるのでNG。
# 上の条件で羊と狼を全頭檻に入れられる順番の組み合わせを全通り示せ。

64 :デフォルトの名無しさん:2017/01/24(火) 19:07:12.25 ID:+VtcL7wL.net
>>63 ここにひとつあります。
http://nojiriko.asia/prolog/c135_633.html

65 :デフォルトの名無しさん:2017/03/22(水) 07:04:04.05 ID:dlSBBY+Y.net
# 出題 : 奇数魔方陣を描く述語 奇数魔方陣/1 を示せ。
# 引数には魔方陣がn×nの時のnが来るものとする。

66 :66:2017/03/22(水) 08:45:48.02 ID:dlSBBY+Y.net
すみません。示せではなくて、描け、です。あるいは
奇数魔方陣/2 として、第二引数に魔方陣が単一化される仕様と
しても、構いません。

67 :デフォルトの名無しさん:2017/03/23(木) 17:49:10.78 ID:qXGTt1Ax.net
>>66
奇数魔方陣の生成です。途中一ヶ所カットが入っていますが、
これがないと、SWI-Prologでは最適化が働かず、
1001 × 1001 のサイズではローカルスタックがオーバーフローしました。
http://nojiriko.asia/prolog/prolog/kisuu_mahoujin.html

68 :デフォルトの名無しさん:2017/06/18(日) 19:43:13.72 ID:2L6xr9gL.net
# 以下の主張をProlog述語として定義せよ。
#
# 愛とは差別を含む関係である.
#

69 :デフォルトの名無しさん:2017/06/24(土) 06:21:50.93 ID:9Zu1BPBK.net
>>68
AがBを愛する関係に入ることが、AはCを愛さない理由を生成してしまう。
と述べればよいのだろうか。
そうだとしたら、高階述語になるなぁ。

70 :デフォルトの名無しさん:2017/08/20(日) 13:20:35.73 ID:hs0NOsBX.net
問題 :: 素数を2から次々と生成する述語。非決定性の素数生成/1を定義してください。

71 :デフォルトの名無しさん:2018/05/23(水) 21:55:27.10 ID:Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

ZH8Y7

72 :デフォルトの名無しさん:2018/07/05(木) 00:07:03.21 ID:RfoszcD2.net
XKH

73 :デフォルトの名無しさん:2019/09/14(土) 14:12:34.15 ID:hhxdRhHk.net
おもしろいけど、メインストリーム言語じゃないから新しく分かりやすい入門者向けの書籍が全然でない…

74 :デフォルトの名無しさん:2020/03/05(木) 19:55:09 ID:h922Dn8C.net
過去に出た古書を読むしかないね
しかし去年のレスって相当過疎だ

75 :デフォルトの名無しさん:2020/11/20(金) 18:03:37.18 ID:kpOgVe3q.net
>>74
ツイッターで質問をするというのが一番早い解決になる

76 :デフォルトの名無しさん:2021/06/10(木) 14:58:11.02 ID:gzqz1I/r.net
>>63

'5匹の羊と5匹の狼を1匹ずつひとつの檻に入れる。
羊の数を狼の数が超えると羊が食べられるのでNG。
上の条件で羊と狼を全頭檻に入れられる順番の組み合わせを全通り出力する'(_檻に入れる順番ならび) :-
檻に入れる(_檻に入れる順番ならび),
forall(append(L,_,_檻に入れる順番ならび),狼の数は羊と同じかそれよりも少ない(L)).

檻に入れる([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]) :-
maplist(member,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10],[[羊,狼],[羊,狼],[羊,狼],[羊,狼],[羊,狼],[羊,狼],[羊,狼],[羊,狼],[羊,狼],[羊,狼]]).

狼の数は羊と同じかそれよりも少ない(L) :-
狼の数(L,_狼の数),_狼の数 =< 5,
羊の数(L,_羊の数),_羊の数 =< 5,
_狼の数 =< _羊の数.

狼の数(L,_狼の数) :-
集計(1,member(狼,L),_狼の数).

羊の数(L,_羊の数) :-
集計(1,member(羊,L),_羊の数).

集計(A,B,C) :-
findall(A,B,L),
sum_list(L,C).

77 :デフォルトの名無しさん:2023/03/07(火) 20:59:15.75 ID:LdqcnnHq.net
(-o-)y-~~~~( -o)y-~~~( )~~~-y(o- )~~~~-y(-o-)クルクル

24 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★