SWI Prolog だと、append/3
は(Lisp なんかと同じように)リストとリストをくっつけるものとして定義されてるみたい(要素とリストをくっつけるものではない)。
だから、
?- append(j, [m,t], L). false.
j
がアトムなのでくっつけてくれない。
正しくは、
?- append([j], [m,t], L). L = [j, m, t].
j
を [j]
のように1要素のリストとして定義してあげると上手く行く。
リストの CAR と CDR を append/3
で推測するのも、書き方によって結果が変わってくる。
?- append(X,Y,[8,9,12]). X = [], Y = [8, 9, 12] ; X = [8], Y = [9, 12] .
上のように素直に書くと、2通りの結果を示してくれる。
では、X, Y
の部分をリストになるように推測させると・・・
?- append([X],[Y],[8,9,12]). false.
ふーん、そうなんだ・・・。Y
に CDR を纏めてくれたりはしないようである。
これは動く。
?- append([X],[Y],[8,9]). X = 8, Y = 9.
片方をリスト表記にするとどうなるだろう。
?- append(X,[Y],[8,9,12]). X = [8, 9], Y = 12 ; false.
この場合は、[Y]
が1要素のリストと解釈されたようである。
大体想像はつくけど、
?- append([X],Y,[8,9,12]). X = 8, Y = [9, 12].
あー、これが望んでる CAR, CDR の動作に一番近いね。
先頭要素を [X]
と1要素だけ推測しろと明示的にしてあげるのがミソかな。
Prolog はまだ入門書を読み始めたばかりなんだけど、あれこれ考えながらいじるのが楽しいね。