リストと繰り返しのつづき

繰り返し

repeatを使った繰り返し。repeatは、自分までバックトラックが達したら再度repeatの次からやり直させる演算子。入力をうけとり、そのまま返したいなら次のようにする。

my_echo :-
        repeat,
        get_char(user_input, C),
        put_char(user_output, C),
        C == end_of_file, !.

入力を最後まで読み飛ばす場合はこれ。

my_echo :- repeat, get_char(user_input, end_of_file), !.

終了条件が後にくるので、repeatはdo-whileのループと同じような感覚で利用できる。

差分リスト

リストの[Head | Tail]のTailが自由変数のリストを差分リストと言うらしい。

| ?- [a,b,c|X] = [a,b,c,d].

X = [d]

yes
| ?- R = [a,b,c|X], X = [c,e | Y].
R = [a,b,c|X], X = [c,e | Y].

R = [a,b,c,c,e|Y]
X = [c,e|Y]

yes
| ?- R = [a,b,c|X], X = [c,e | Y], Y = [f, g].
R = [a,b,c|X], X = [c,e | Y], Y = [f, g].

R = [a,b,c,c,e,f,g]
X = [c,e,f,g]
Y = [f,g]

yes
| ?-

リストの途中にいきなり連結できる。