1

これを別の質問としてするように勧められたので、そうします。

系図のように、私は人々の木を持っています。人から始まり、両親、祖父母などに分岐します。人を木のスポットに挿入できるようにしたいです(基本的に、そこにいる人を置き換えます)。

これらのデータ型は重要です:

datatype year    = Year of int | UnkYear | Irrelevant
datatype name    = Name of string | UnkName
datatype sex     = Man | Woman | UnkSex
datatype person  = Person of name * sex * year * year
datatype parents = Dad | Mom
datatype tree    = Unspec | Info of person * tree * tree

割り当ては次のとおりです: 関数 insert : tree *parents list * person -> tree を宣言し、insert (t, pos, p) を呼び出すと、人物 p がツリー i の位置 pos に挿入されます。ツリーに存在します。そうでない場合は、t を返す必要があります。

したがって、ツリー内の人 (お母さんとしましょう) を取り、彼女を Lucy に置き換えることができる必要があります (Mom と Lucy は両方ともデータ型 person を使用して事前に宣言された値です)。

これまでのところ、私はこれを持っています:

fun insert (Info(n,mf,ft) , Mom::xs , p) = Info(p, mf, insert(ft,xs,p))
  | insert (Info(n,mf,ft) , Dad::xs , p) = Info(p, insert(mf,xs,p), ft)
  | insert (Info(n,mf,ft) , [] , p)      = Unspec

t の pos にいる人を削除し、ルートを p に置き換えるだけのようです - 私がやりたいことではありません :S また、パターン マッチングは終了していません。

ここに移動するためのアイデアはありますか?

4

1 に答える 1

3

わかりました。指定された位置に到達したら、ツリー内のその時点の人物を指定された人物に置き換えます。あなたがしていることは、目的地に到着したときを除いて、途中で人を置き換えることです。目的地に到着した場合は、そこにあるノードを削除するだけです。

したがって、あなたがする必要があるのは:

親リストがまだ空でない場合は、その人nを次のように置き換えないでくださいp。適切なサブツリーに移動するだけです。

親リストが空で、現在Infoノードにいる場合は、そのノードの人をに置き換えてくださいp

親リストが空で、現在Unspecノードを使用している場合は、Unspecをp2つの空のサブツリー(つまりUnspecs)を含む新しいInfoノードに置き換えます。

親リストがまだ空ではないのにUnspecノードに到達した場合はUnspec、割り当てに従ってツリーを変更せずに、を返すだけです。

于 2010-10-10T09:39:24.267 に答える