回答:
LISPで働いてからしばらく経ちましたが、覚えているように、基本的な非原子構造はリストです。他のすべてはそれに基づいています。したがって、各原子がノードである原子のリストがあり、その後にノードを他のノードに接続するエッジのリストがあります。他の方法もあると思います。
たぶんこのようなもの:
(
(a (b c)),
(b (a c)),
(c (a b d)),
(d (c))
)
次のようなグラフを作成できます。
a <-> b <-> c <-> d ^ ^ | | + --------- +
あなたが空想を得たいなら、あなたもそれに重みを加えることができます:
(
(a (b 1.0 c 2.0)),
(b (a 1.0 c 1.0)),
(c (a 1.3 b 7.2 d 10.5)),
(d (c -10.5))
)
また、これに興味があるかもしれません:CL-Graph(フレーズ「lisp graph structure」をgoogle-searchして見つけた)
関数型言語は、非関数型言語と同じ方法でデータ構造を処理します。実装からインターフェイスを分離し、抽象データ型を作成します。
Lispで抽象データ型を作成できます。たとえば、グラフの場合、いくつかの関数が必要になる場合があります。
(define (get-vertices graph) ;; gets all the vertices from a graph
...)
(define (get-edges graph) ;; gets all the edges from a graph
...)
(define (get-weight vertex-from vertex-to) ;; get the weight of a specific vertex
...)
グラフへのインターフェイスを作成したら、実際のデータ構造をさまざまな方法で実装でき、プログラマーの効率、柔軟性、計算効率などの要因を最適化できます。
重要なのは、グラフを使用するコードがグラフインターフェイスのみを使用し、基になる実装にアクセスしないようにすることです。これにより、実際の実装から切り離されたクライアントコードがよりシンプルになります。