next up previous
Next: 8.3 ハッシュ表を用いて隣接点リストを表す Up: 8 グラフの記述 Previous: 8.1 連想リスト

8.2 隣接点リストを頂点シンボルの属性リストで表す

属性リスト(property list)とは,シンボルに対して属性の名前に付随してデー タを覚えておくためのリストのことです.属性リストの構造はキーとデータが 交互に現れる形のフラットな構造をしています. 頂点をシンボルで表現し,隣接点リストを,そのシンボルの属性リストとして 保持する方法は以下のようになります.属性リストをシンボルに与える場合には, その属性の名前(キーの種類の名前)が必要です.この名前は自由に付けてよ く,以下ではneighborsという名前を使っています.
<cl> (get 's 'neighbors)
(a d) 
<cl> (get 'd 'neighbors)
(s a e) 
<cl> (get 'x 'neighbors)
nil
属性リストの内部での表現は,キーとデータが交互に 入ったリストになっています.シンボルの属性リスト全体を 返す関数として,symbol-plistというものがあります. また,属性のキーをなくすための関数としてrempropがあり, getに第三引数を与えた場合には,第二引数で与えた属性が なかった場合に返すその第三引数に与えた値が返ります. 属性リストでグラフの隣接点を表現した場合に, グラフ全体に存在する頂点すべてを知るためには, 別のシンボル(上では*graph3*)にその頂点のリストを覚えて おかないと今考えているグラフの頂点がどれかわからなくなります. しかし,リスプのシンボルすべてのうちでneighborsという属性を 持ったものを探すためにはどうするか,という場合には, do-all-symbolsというマクロがあります.以下のように使えます.
<cl> (do-all-symbols (sym)
        (if (get sym 'neighbors)
            (print (list sym
                        (get sym 'neighbors)))))
(a (s b d)) 
(b (a c e)) 
(c (b)) 
(d (s a e)) 
(e (b d f)) 
(f (e)) 
(s (a d)) 
nil 
<cl>


generated through LaTeX2HTML. M.Inaba 平成18年5月6日