Let`s 내가 예를와 부울 표현식에서 괄호를 제거하는 방법 AND와 OR
를 들어, 목표는,이 식에 괄호를 제거하는 것입니다(A || B) && (C || D)
몇 가지 간단한 부울 표현식이 있다고
(A || B) && (C || D) => A && C || A && D || B && C || B && D
&&
은 왼쪽에서 오른쪽으로 ||
전에 평가됩니다. 나는 다음과 같은 대수 데이터 형식을 만든이를 위해 :
sealed trait Predicate
case class Or(left: Predicate, right: Predicate) extends Predicate
case class And(left: Predicate, right: Predicate) extends Predicate
case object True extends Predicate
case object False extends Predicate
Let`s 우리가 이미 Predicate
에 문자열로 변환 문자열 파서, 어떤 종류의가 있다고 가정합니다, 그것은 추상 신택 틱 나무의 일종을 구축합니다. 예를 들어 표현 (true || true) && (true || true)
의 경우 다음 트리를 갖게됩니다 : And(Or(True, True), Or(True, True))
. 여기서 우리는 중괄호를 고려합니다. Or(Or(And(A, C), And(A, D)), Or(And(B, C), And(B,D)))
을 받아야합니다. 나는 다음과 같은 솔루션 붙어 :
def extractOr(pred: Predicate): Predicate = pred match {
case And(Or(l, r), Or(ll, rr)) => Or(Or(And(l, ll), And(l, rr)), Or(And(r, ll), And(r, rr)))
case And(Or(l, r), p) => Or(And(l, p), And(r, p))
case And(p, Or(l, r)) => Or(And(p, l), And(p, r))
case p => p
}
def popOrPredicateUp(pred: Predicate): Predicate = pred match {
case And(l, r) => extractOr(And(popOrPredicateUp(l), popOrPredicateUp(r)))
case Or(l, r) => Or(popOrPredicateUp(l), popOrPredicateUp(r))
case p => p
}
그러나이 경우에 대한 예를 들어 잘못된 작동합니다 And(False, Or(And(Or(True, True), False), True))
UPD : @coredump가 지적한 바와 같이, 내가 함께, 마지막으로 DNF(sum of products)
제목 질문과 소개를 바탕으로 처음에는 https://en.wikipedia.org/wiki/Disjunctive_normal_form을 계산할 것인지 또는 어떻게 든 코드를 리팩터링하려는 것인지 여부는 명확하지 않았습니다. 또는 결국 DNF를 원하지 않을 수도 있습니다. 이 숙제가 있니? – coredump
@coredump : DNF (제품 합계) - 정확히 내가 찾고있는 것! 좋은 지적. – ponkin
"And (False, Or (True), True (True)))") "False로 단락되면 즉시 False로 단락시키지 않으시겠습니까? 거짓으로? –