DOBON.NETプログラミング掲示板過去ログ
Prologではどのように変数を用意して解の構造を作っているのか
題名: Prologではどのように変数を用意して解の構造を作っているのか
著者: 一ノ瀬
日時: 2014/07/27 4:08:14
ID: 32509
この記事の返信元:
(なし)
この記事への返信:
[32513]
Re[1]: Prologではどのように変数を用意して解の構造を作っているのか
shu
2014/07/29 16:32:16
ツリーを表示
環境/言語:[環境(Windows7 64bit)、使用言語(Prolog)]
分類:[.NET]
現在途方にくれています、よろしくお願い致します。
リストを逆順にする述語を
reverse(X,Y) :- reverse(X,[],Y).
reverse([],Y,Y) :- !.
reverse([H|T],Aux,Y):- reverse(T,[H|Aux],Y).
と定義したとき、
reverse([a,b], X)で実行した場合はわかるのですが、
reverse(X, [a,b])で実行した場合にどのように解を求めているのかがわかりません。
Prologでは、解の具体的な値がその時点で不明でも必要な変数を用意して解の構造を作り上げるというので、
X = [H1|T1]というように変数を用意して考えていってみたのですが、そうするとどこまでも変数が続いてしまい、終わりません。
しかし、実際に実行してみると答えが出てくるので成立はするはず…と困っています。
reverse(X, [a,b])
= reverse(X, Y)
→reverse(X, [], [a,b])
X = [H1|T1], [] = Anx1として、
= reverse([H1|T1], Aux1, [a,b])
→reverse(T1, [H1|Aux1], [a,b])
T1=[H2|T2], [H1|Aux1]=Aux2として
= reverse([H2|T2], Aux2, [a,b])
→reverse(T2, [H2|Aux2], [a,b])
・
・
・
上記のようになってしまうと思うのですが、どうなっているのでしょうか?
もうずっと悩み続けていて途方にくれています。
どうかご教授お願い致します!
題名: Re[1]: Prologではどのように変数を用意して解の構造を作っているのか
著者: shu
日時: 2014/07/29 16:32:16
ID: 32513
この記事の返信元:
[32509]
Prologではどのように変数を用意して解の構造を作っているのか
一ノ瀬
2014/07/27 4:08:14
この記事への返信:
(なし)
ツリーを表示
■No32509に返信(一ノ瀬さんの記事)
予想:
(a) reverse(X,Y) :- reverse(X,[],Y).
(b) reverse([],Y,Y) :- !.
(c) reverse([H|T],Aux,Y):- reverse(T,[H|Aux],Y).
として
(b)がゴールなので
reverse([], [a,b], [a,b]) :- !.
を適用
(c)に当てはめ
reverse([a], [b], [a,b]):- reverse([], [a,b], [a,b])
(c)に当てはめ
reverse([b,a], [], [a,b]) :- reverse([a], [b], [a,b])
(a)に当てはめ
reverse([b,a], [a,b]) :- reverse([b,a], [], [a,b])
よって
X=[b,a]
となる。
DOBON.NET
|
プログラミング道
|
プログラミング掲示板
分類:[.NET]
現在途方にくれています、よろしくお願い致します。
リストを逆順にする述語を
reverse(X,Y) :- reverse(X,[],Y).
reverse([],Y,Y) :- !.
reverse([H|T],Aux,Y):- reverse(T,[H|Aux],Y).
と定義したとき、
reverse([a,b], X)で実行した場合はわかるのですが、
reverse(X, [a,b])で実行した場合にどのように解を求めているのかがわかりません。
Prologでは、解の具体的な値がその時点で不明でも必要な変数を用意して解の構造を作り上げるというので、
X = [H1|T1]というように変数を用意して考えていってみたのですが、そうするとどこまでも変数が続いてしまい、終わりません。
しかし、実際に実行してみると答えが出てくるので成立はするはず…と困っています。
reverse(X, [a,b])
= reverse(X, Y)
→reverse(X, [], [a,b])
X = [H1|T1], [] = Anx1として、
= reverse([H1|T1], Aux1, [a,b])
→reverse(T1, [H1|Aux1], [a,b])
T1=[H2|T2], [H1|Aux1]=Aux2として
= reverse([H2|T2], Aux2, [a,b])
→reverse(T2, [H2|Aux2], [a,b])
・
・
・
上記のようになってしまうと思うのですが、どうなっているのでしょうか?
もうずっと悩み続けていて途方にくれています。
どうかご教授お願い致します!