
 
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 はまだ入門書を読み始めたばかりなんだけど、あれこれ考えながらいじるのが楽しいね。
 
 
 
