3

課題がありますが、どうしたらよいかわかりません。私には、名前、生年月日、死亡年の人の木があります。ここで系図を考えてください。年齢、名前、ツリー自体などを処理するためのデータ型がたくさんあり、次に人とツリーがたくさんあります。

データ型は次のとおりです。

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

まず、この位置とその「下」にあるすべてのものを削除できるようにする必要があります。したがって、「Mom」を削除すると、お母さんとその両親、祖父母などが削除されます。呼び出された位置に人がいない場合、関数はツリーを返す必要があります。これは次のようになっているはずです:remove:Tree*親リスト->Treeそして呼び出しはremove(t、pos)です

これは私が持っているものですが、それは完全には正しくありません。私は4行でそれを行うことができると言われました。

fun replace (Info(n,mf,ft) , Mom::[]) = Info(n,replace(mf,[]),Unspec)
  | replace (Info(n,mf,ft) , Dad::[]) = Info(n,Unspec,replace(ft,[]))
  | replace (Info(n,mf,ft) , [])      = Info(n,mf,ft)
  | replace (Info(n,mf,ft) , Mom::xs) = Info(n,replace(mf,[]),replace(ft,xs))
  | replace (Info(n,mf,ft) , Dad::xs) = Info(n,replace(mf,xs),replace(ft,[]))
  | replace (Unspec , x::xs)          = Unspec
  | replace (Unspec , [])             = Unspec;

私が持っているアイデア:

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

しかし、それは正しくありません。私は何をしますか?

また、位置posのツリーtに人pを挿入できるはずです。位置が存在しない場合は、ツリーを返すだけです。挿入:ツリー*親リスト*人->ツリー

私はこれに頭を悩ませることができず、誰かが私を助けてくれることを望んでいます。私はこれで十分に明確になっていることを願っています(私はそれが長いことを知っています)。

4

1 に答える 1

2

(どうやら私の以前の答えはdbクラッシュを乗り越えられなかったので再投稿)。

あなたはリストの先頭に立って、母親または父親のサブツリーに分岐するかどうかを決定しています。正解です。次に、リストの末尾をパスの残りの部分として使用します。これも正しいです。ただし、リストが空の場合(つまり、目的地に到達した場合)、次のようにします。

| remove (Info(n,mf,ft) , [])      = Info(n,mf,ft)

言い換えれば、何もありません。これを次のように変更した場合:

| remove (Info(n,mf,ft) , [])      = Unspec

パスがつながるツリーのノードをUnspecに置き換えて、意図したとおりに機能します。

于 2010-10-09T15:17:06.293 に答える