논리와 집합 - 한정명제 with Python

in #kr7 years ago

안녕하세요 @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 함수로 쉽게 구현이 가능합니다. 유용하게 쓰이는 개념이므로 익혀두시면 도움이 많이 되실겁니다. ^^

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 63470.48
ETH 2544.22
USDT 1.00
SBD 2.72