2012-09-08 3 views
1

함수에 전달 된 인수에 패턴 일치를 사용하고 있습니다. 방법은 말을 너무 일치 "첫 번째 수준"하지만 깊이가 오류를 제공 이동하려는 모든 시도에 대해 잘 작동SML 함수 인수 패턴 일치

예를

fun nnf T = T 
    | nnf F = F 
    | nnf (LETTER(x)) = (LETTER(x)) 
    | nnf (NEG(x)) = (NEG(nnf x)) 
    | nnf (AND(x,y)) = (AND(nnf x, nnf y)) 
    | nnf (OR(x,y)) = (OR(nnf x, nnf y)) 
    | nnf (IMP(x,y)) = (OR(NEG(nnf x),(nnf y))) 
    | nnf (NEG(NEG(LETTER(x)))) = (LETTER(x)) 
    | nnf (NEG(AND(LETTER(x),LETTER(y)))) = (OR(NEG(LETTER(x)),NEG(LETTER(y)))) 
    | nnf (NEG(OR(LETTER(x),LETTER(y)))) = (AND(NEG(LETTER(x)),NEG(LETTER(y)))); 
val nnf = fn : prop -> prop 

오류 난 "을 표준 입력 : 282.5-291.77 오류 중복에게 일치"

stdIn:282.5-291.77 Error: match redundant 
      T => ... 
      F => ... 
      LETTER x => ... 
      NEG x => ... 
      AND (x,y) => ... 
      OR (x,y) => ... 
      IMP (x,y) => ... 
    --> NEG (NEG (LETTER x)) => ... 
    --> NEG (AND (LETTER x,LETTER y)) => ... 
    --> NEG (OR (LETTER x,LETTER y)) => ... 

그렇게 SML 무엇 다음 것은 다른 경우에도 "(NEG ("그들은 모두 시작부터 함수 정의의 마지막 3 절은 같은 것을 말하고있다 얻을.

어떻게 극복합니까?

답변

4

케이스 NEG(x)은 이미 가장 바깥 쪽의 케이스 인 NEG을 커버하므로 다른 케이스에는 도달하지 않습니다. 실제로 달성하고자하는 것에 따라 해당 케이스를 제거하거나보다 구체적인 케이스를 이동하십시오 (순서대로 시도한 경우).

+0

감사합니다. 그 트릭을했다. 바보 나 :) – Ankit