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

§1637 · Posted By · 5月 21, 2014 · Development · Tags: , , · [Print]