논리와 집합 - 한정명제 with Python
안녕하세요 @tmkor 입니다. 오늘은 한정명제에 대하여 알아보려 합니다. 논리와 집합에서 앞으로 죽어라 나오는게 한정명제 입니다. 전칭명제와 한정명제를 조합하여 다양한 집합이나 관계를 모델링할 수 있습니다. 우리 머리속에는 쉽게 들어있는 개념이지만, 수학식으로 짧게 표현하다보면 때론 어렵게 느껴지기도 합니다. AND 게이트와 OR 게이트로 이해하면 편합니다.
정의부터 살펴보도록 하겠습니다.
한정명제 : 전칭명제 + 존재명제
전칭명제(universal proposition) : 모든 대상영역의 원소가 참인 명제
∀ x in U : p(x)
전칭기호(universal quantifier) : ∀
- latex 에서 \forall
존재명제(existential proposition) : 대상영역의 원소가 하나 이상 참인 명제
∃ x in U : q(x)
존재기호(existential quantifier) : ∃
- latex 에서 \exists
이번에는 python에서 map과 reduce 함수로 한정명제를 작성해 봅시다.
전칭명제와 존재명제는 & 명령으로 reduce하냐, | 명령으로 reduce하냐의 차이일 뿐 구조가 동일하기 때문에 고차함수 proposition을 만들고 인자로 & 명령과 | 명령을 익명함수로 대입하면 됩니다.
from functools import reduce
def proposition(quantifier, domain, predicate):
return reduce(lambda x,y:quantifier(x,y), list(map(lambda x:predicate(x), domain)))
def universal(domain, predicate):
return proposition(lambda x,y:x&y, domain, predicate)
def existential(domain, predicate):
return proposition(lambda x,y:x|y, domain, predicate)
def p(x):
return x % 2 == 1
def q(x):
return x > 1
prime = {2,3,5,7,11,13} # 일부만..
print("모든 소수는 홀수이다. %s" % universal(prime, p))
print("홀수인 소수가 존재한다. %s" % existential(prime, p))
print("모든 소수는 1보다 크다. %s" % universal(prime, q))
print("1보다 큰 소수가 존재한다. %s" % existential(prime, q))
결과는 다음과 같습니다.
모든 소수는 홀수이다. False
홀수인 소수가 존재한다. True
모든 소수는 1보다 크다. True
1보다 큰 소수가 존재한다. True
보시다시피 전칭명제와 한정명제는 reduce 함수로 쉽게 구현이 가능합니다. 유용하게 쓰이는 개념이므로 익혀두시면 도움이 많이 되실겁니다. ^^