2012-01-02 16 views
2

演算子l_op : A list * A list -> A listを定義して、別の演算子を必要とする演算子op : A * A -> Aを定義します。 a0: Aの場合、a1 : Aop a0 a1は常にAとして結果を返します。a1の結果はとなります。は他のa1より意味があります。OCamlで演算子の測定関数を定義します。

直感的l_op al0 al1al0の各要素に対して、opに関して、al1有意義な要素を見つけに一致の戦略を必要とします。その後、opの結果リストはl_opの結果になります。

したがって、私はの意味がである必要があります。

可能な選択の1つは、機能measure: A * A * A -> intを定義することができます。例えば、measure a0 a1 (op a0 a1)は、op a0 a1が意味をなす方法を表す1から10までのintを与えます。次に、l_op al0 al1の実装では、がal0の場合、a1measure a0 a1 (op a0 a1) >= measure a0 a1' (op a0 a1') for all a1' in al1のようになります。整数演算は理にかなっている方法を表し、そして、私は私がop : A * A -> A * intに少しopを変更...

もう一つの選択である、二つのリストからa0a1を削除し、2つのリストの残りの部分と一致します。次に、l_op al0 al1の実装では、がal0の場合、a1のようにfor all a1' in al1, m1 >= m1' where (_, m1), (_, m1') = op a0 a1, op a0 a1'が見つかります。

2番目の選択肢の利点は、op a0 a1を実行しながら測定を計算できるため、いくつかのコードを保存できることです。欠点は、op : A * A -> A * intの署名がop : A * A -> Aより格好悪いことです。

だから私の質問は以下のとおりです。

1)があり、おそらくhことによって開始機能を()測定のこの種の従来の言葉ですが、私はそれを忘れてしまった、誰もが思い出させるだろうか?

2)intは測定に適したタイプですか?たぶん、そのタイプを定義することができます...最も一般的な方法は何ですか?

3)私が上記の選択肢はどれですか?それとも誰かが良いアイデアを持っていますか?

答えて

2

(おそらくhで開始)機能を測定するこの種の従来のワード、

たぶん「ヒューリスティック」がありますか?それは古代ギリシャ語から "発見して発見する"ものであり、コンピュータ科学では「十分に良い」結果を求める方法に名前をつけて使用されています。あなたの "意味測定"が本当にヒューリスティック/近似でない限り、ここでは本当に適切ですが、 "h"で始まります。

あなたの測定値を「スコア」または「重み」と呼ぶことをお勧めします。

あなたはint型が測定に適していると思いますか?たぶん、そのタイプを定義することができます...最も一般的な方法は何ですか?

どのように測定が定義されているかによって異なります。結果にどの程度の構造が必要ですか(たとえば、測定の正当性を保ち、より豊かな構造が必要な場合など)。どのような操作を測定中に使用しますか?加算と定数のみを使用する場合は、intは問題ありません。除算などを使用する場合は、floatが必要な場合があります。どのような場合でも、値を比較できる型が必要です。

ほとんどの場合、intは大丈夫ですが、そうでなければ比較的簡単に気分を変えることができます。あなたのコードのほとんどでmeasureの代わりint使用することができ、その後すべての出現を交換する必要はありません

type measure = int 

この方法:あなたがこれを変更する場合は、タイプの別名を使用することができます。つまり、OCamlでは、推論のおかげで型アノテーションが多くは書かれていないので、実際には多くのコードで型定義の詳細が広がるとは思っていません。

上記の選択肢はどれですか?それとも誰かが良いアイデアを持っていますか?

2番目の選択肢を選択します。私は、 "結果の計算"のA -> A -> A操作と "結果の意味の計算"のA -> A -> int操作の間にいくつかの冗長性があると思われます。両方を同時に行うことで(A -> A -> A * int)、同じ論理構造を再利用することができ、その対応がより明確になり(コードが少なくなります)。逆に2つの操作が完全に無関係なら、2つの別個の演算子を持つことを考慮することができます(ただし、スコアリングにはまだA -> A -> intを使用します;意味を測定するために結果を取得する必要がある場合は、

関連する問題