【論理】Prolog【初心者】

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

これは良い言語だ…
2011/10/22(土) 23:23:48.25
このfor/3を実装するのに、結構試行錯誤したわ
http://www.ifcomputer.com/IFProlog/Manuals/v4.1/reference/for/home_en.html

Prologって全然直感的じゃないな
2011/10/22(土) 23:51:13.94
>>285
これはC言語等の下劣な仕様に阿っているのが悪いのであって、
第二引数と第三引数を交換するだけで、
(分かりやすくするため 最終値 >= 初期値 のケースだけにする)

for(_初期値_式,_最終値_式, _カウンタ) :-
    _初期値_式 > _最終値_式,!,fail.
for(_初期値_式,_最終値_式, _カウンタ) :-
    _カウンタ is _初期値_式.
for(_初期値_式,_最終値_式, _カウンタ) :-
    _初期値_式_2 is _初期値_式 + 1,
    for(_初期値_式_2,_最終値_式, _カウンタ).

当たり前のPrologの述語となる。強いてちょっと
気持ち悪いのは第一節の !,fail. くらい。
2011/10/22(土) 23:59:17.38
>>285
直感的に書ける処理が手続き型とは根本的に違う、と考えたほうがいい
むしろ手続き型で書き辛い処理が書きやすい言語って感じるよ俺は
288286
垢版 |
2011/10/23(日) 00:10:58.32
一般にPrologでは

foo(S,E,X) :- の形式をとり、
Sはカウンタ、X でそれを取り出す。
Eは限界値を示す。
これで数値カウンタループ述語を構成する。

for/3は

repeat.
repeat :- repeat.

のrepeatパターンの述語。
member/2やappend/3もこのパターン。
どれも非決定性述語である。

member(A,[A|_]).
member(A,[_|R]) :- member(A,R).

append([],L,L).
append([U|X],Y,[U|Z]) :- append(X,Y,Z).

?- append(_,_,_), ・・・ とするとrepeatと同じ機能となる。
(ただし繰り返しが多くなるとスタックオーバーフローが起きるかも知れない)
289288
垢版 |
2011/10/23(日) 00:13:04.91
>>288
すみません。一番最後から二行目
?- append(_,_,_),・・

です。アンダースコアが飛んでしまった。
2011/10/23(日) 00:14:27.91
ありがちなミス

for(Lower,X,Upper) :-
Lower = X ; for(Lower+1,X,Upper).
2011/10/23(日) 00:19:43.74
>>287
そうですか。早くPrologの醍醐味が味わいたいっすね。
ちなみに俺のコードは、↓

% for(_初期値_式, _カウンタ, _最終値_式)
for(A, A, A) :- !.
for(A, A, _).
for(A, R, E) :- (A < E -> B is A + 1 ; B is A - 1), for(B, R, E).

やっていることは、>>286と近いんだろうけど、 かなり趣が異なる感じ…。
2011/10/23(日) 00:30:08.03
>>291
立派なコードだと思うけど。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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