1

私は Haskell の全くの初心者で、DPLL を使用して単純な SAT ソルバーを作成しようとしています。

(A1 and A2 ...) Or (B1 and B2 ...)スキーマを結合正規形にする関数 expand があります: (A1 or B1) and (A1 or B2) and ... (A2 or B2) and ...

式のデータ型を次のように表しました

type Term = Int
data Expr = Or Expr Expr | And Expr Expr | Literal Term

(-x で Not(x) を表すことができるので、否定は気にしません)

しかし今、expand を書いていると、これはコンストラクタータグで非常に見苦しくなります。

expnd (Literal l) (Literal r) = Or (Literal l) (Literal r)
expnd (Literal t) (And l r) = And (expnd (Literal t) l) (expnd (Literal t) r)
expnd (And l r) (Literal t) = And (expnd l (Literal t)) (expnd r (Literal t))
expnd (And l1 r1) (And l2 r2) = 
   And (And (expnd l1 l2) (expnd l1 r2)) (And (expnd r1 l2) (expnd r1 r2))

このコードをよりきれいにすることはできますか?

4

2 に答える 2

2

asケースにパターンを使用しLiteralて、冗長性を取り除くことができます。たとえば、最初のケースは次のように記述できます。

expnd l@(Literal _) r@(Literal _) = Or l r
于 2014-01-18T04:01:24.693 に答える