私は大きな問題を小さな部分に分けて、一度に1つずつしようとしています。ハスケルを使って式からトートロジを削除する
私は、式からトートロジを削除する関数を書いています。基本的な考え方は、リテラルとその否定が見つかった場合、その値が最終的に私のアプローチは、これを削除する関数を作成することですが、節のためにそれを数式にマップします。もちろん、私は最初に重複を削除する必要があります。
module Algorithm where
import System.Random
import Data.Maybe
import Data.List
type Atom = String
type Literal = (Bool,Atom)
type Clause = [Literal]
type Formula = [Clause]
type Model = [(Atom, Bool)]
type Node = (Formula, ([Atom], Model))
removeTautologies :: Formula -> Formula
removeTautologies = map tC.map head.group.sort
where rt ((vx, x) : (vy, y) : clauses) | x == y = rt rest
| otherwise = (vx, x) : rt ((vy, y) : clauses)
私はそれを(例えば(V BはVの-A)^(BのV CのVのA))の式を与えることをしようとすると、今、私は問題を抱えている。その一例を考えると最初の句は、リテラルAが含まれていますおよび-A。これは、節が常に真であることを意味します。その場合、集合全体を簡単に(B v C v A)に単純化することができます。しかし、私は次を取得します
Loading package old-locale-1.0.0.2 ... linking ... done.
Loading package time-1.1.4 ... linking ... done.
Loading package random-1.0.0.2 ... linking ... done.
[[(True,"A"),(True,"B")*** Exception: Algorithm.hs:(165,11)-(166,83): Non-exhaustive patterns in function rt
どうすればよいですか?あなたは徐々にrt
に短くリストを渡しているあなたの再帰呼び出しで
rt [(True,"A"),(True,"B"),(False,"A")] =
= rt ((True,"A"):(True,"B"):[(False,"A")] =
-- (vx,x) = (True,"A"), (vy,y) = (True,"B"), clauses = [(False, "A")]
= (True, "A") : rt ((True,"B"):[(False, "A")] =
-- (vx,x) = (True,"B"), (vy,y) = (False,"A"), clauses = []
= (True, "A") : (True,"B") : rt (False, "A"):[] =
-- (vx,x) = (True,"B"), (vy,y) = ???
:
あなただけの既存の質問を変更しました。私は、右上の「質問する」ボタンを押して*新しい*質問を作成することを意味しました。それがフロントページに表示され、他の人にもあなたを手伝うようになります。また、私の答えは見えていません:)ちょうどその新しい質問にあなたの変更されたコードを含めるようにして、関数が生成している入力と出力の例と期待していたものを表示してください。あなたは良い質問[ここ](http://tinyurl.com/so-hints)を求めるための他のヒントを見つけることができます。 –