私はこのようなことに遭遇したことは一度もありません。
デフォルトでこれを実装しないという計算上の理由があります。パターンマッチングの前にすべての入力の組み合わせを生成するか、完全なクロス積価値の一致句を生成する必要があります。
これを実装する通常の方法は、両方のパターン(バイナリの場合)を書くこと、つまりC or $X
と$X or C
の両方のパターンを作成することだと思われます。
データの基盤となる組織(通常はタプル)に応じて、このパターンマッチングではタプル要素の順序を並べ替えることになります。それが代わりにリストであれば、あなたはより揺れ動く地にいます。ちなみに
は、私はあなたが基本的にしたい操作がセットにばらばら組合パターン、であることが疑われる例:
foo (Or ({C} disjointUnion {X})) = ...
任意の詳細セットを扱う私が見てきた唯一のプログラミング環境は以下のようになりイザベル/ HOL私はあなたがそれらの上にパターンマッチを構築することができるかどうかまだ分かりません。
編集:それはあなたが、彼らは一貫して使用されていることを証明する必要があり、その後除き、あなたは複雑な非コンストラクタパターンを定義できます(というfun
より)イザベルさんfunction
機能のように見える、とあなたはもうコードジェネレータを使用することはできません。
EDIT 2:クエリが一致するように許可された$X
形態B | C | $X
のであった
私の用語は、フォームA | B | C | D
であった:私はn
可換、連想と推移オペレータにわたって同様の機能を実現方法はこれでしたゼロ以上のもの。私はレオグラフィックの順序付けを使用してこれらをあらかじめソートしていたので、変数は常に最後の位置に発生していました。
まず、すべてのペアワイズマッチを作成し、今のところ変数を無視し、ルールに従ってマッチするものを記録します。
{ (B,B), (C,C) }
あなたは二部グラフとしてこれを扱う場合は、基本的にperfect marriage問題をやっています。これらを見つけるための高速アルゴリズムが存在する。あなたがものを見つけると仮定
は、あなたは(この例では、A
とD
)あなたの関係の左側に表示されないすべてのものを集めて、あなたは変数$X
にそれらを詰め込むと、あなたのマッチがありますコンプリート。明らかに、ここではどの段階でも失敗する可能性がありますが、RHSに変数がない場合や、LHS上にコンストラクタが存在する場合(ほとんどの場合、完璧な一致を見つけることができません)
これはちょっと混乱している場合は申し訳ありません。私はこのコードを書いてからしばらくしていますが、これがあなたを少しでも助けてくれることを願っています!
この場合、このはとなる可能性があります。私は、サブターム(つまり、単純な平等ではない)に「一致」するという非常に複雑な概念を持っていました。多分あなたのケースではうまくいくでしょうし、別々の組合を直接計算することもできます。
は私がMLのパターンマッチング対Prologのパターンマッチングのあなたの混同に同意するか分かりません。 MLパターンマッチングは純粋に構文的なものであり、Prologではこれが当てはまるとは思わない。 – Gian
私は彼らが同じものだと言っているわけではありません、彼らは厳密な順序で要素の比較を共通に持っているだけです。 – rwallace
私は、Otterのような専用の定理を証明するソフトウェアは、論理式を通常の形で配置し、そのデータ構造をO(n log n)時間の作成と検証に費やす設定データ構造として扱うことによって、実際に、私は連想性や可換性のようなプロパティの操作のための最適化を事前にプログラムしていると思います。 –