그래, 작은 부분으로 구성된 거대한 문제를 나누어서 한 번에 하나씩 처리하려고합니다.하스켈을 사용하여 수식에서 동어 반복을 제거합니다.
수식에서 동어 반복을 제거하는 함수를 작성하고 있습니다. 기본 개념은 절에서 리터럴과 부정이 발견되면 마침내 값에 관계없이 절이 true라는 것을 의미합니다 우리의 방법은 절을 제거하고 공식에 매핑하는 함수를 만드는 것입니다. 물론, 나는 처음부터 중복을 제거해야한다. I (예 : (A 브이 B 브이 -A)^(B 브이 C 브이 A)에 대해) 한번 식을 수득 할 때
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)
은 이제 문제가있다. 즉, 예를 고려할 때 상기 제 1 절 리터럴 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
어떻게해야합니까?
당신은 단지 기존 질문을 변경. 나는 당신이 오른쪽 상단에있는 "질문하기"버튼을 눌러 * 새로운 * 질문을 만들 것을 의미했습니다. 그러면 첫 페이지에서 다른 사람들이 당신을 도울 수 있습니다. 또한, 내 대답은 어색해 보이지 않을 것입니다 :) 그냥 새 질문에 변경된 코드를 포함시키고, 함수가 생성하는 입력과 출력의 예와 기대했던 것을 보여줍니다. 좋은 질문을하기위한 다른 요령을 찾을 수 있습니다 [여기] (http://tinyurl.com/so-hints). –