빈 리스트에 대한 all? 함수의 리턴 값은? - 공허참(vacuous truth)
(ohyecloudy.com)- 빈 리스트에 대한
Enum.all?
함수 리턴 값이true
- Haskell의
all
, Python의all
, Clojure의every?
함수도 똑같이 동작
- Haskell의
- 빈 리스트에 대해 true를 리턴하면 구현하기 쉬움
-
true && f(elem1) && f(elem2) ...
- 하지만 구현상 편의 때문에 저렇게 구현한 게 아님
- 논리학의 공허참(vacuous truth) 정의에 부합하게 구현한 것임
-
- 공허참을 이해하기 위해선 실질 조건문을 살펴봐야 함
- p가 거짓이면 p → q는 항상 참
- “자유의 여신상이 서울에 있다면 에펠탑은 포항에 있다”는 참
- p인 “자유의 여신상이 서울에 있다”가 거짓이기 때문
- 이런 실질 조건문에서 p가 거짓이라 무조건 참이되는 걸 공허참이라고 함
- 공허참에서는 비어있는 집합(set)에 대해서는 어떠한 명제도 참이 된다
- '방 안의 모든 휴대폰이 꺼져 있다'를 예로 들면
- x는 방에 있는 모든 것
- P(x)는 'x는 휴대폰이다'
- Q(x)는 'x는 꺼져있다'
- x가 비어 있기 때문에 P(x)는 거짓. 공허참에 의해 항상 참이 된다.
- 그래서 비어 있는 리스트에 대한 Enum.all? 함수의 리턴 값은 true가 된다.
배워갑니다ㅎ공유 감사해요
수학적, 컴공적 접근은 이래도 코딩땐 헷갈려서 활용 안하는게 좋아보여요ㅋㅋ
특히 if문에서는 빈 리스트를 False로 인식해서 많이 헷갈립니다
파이썬 기준 아래와 같습니다.
all([]) == True
all([[]]) == False
저는 그래서 코드를 읽을 사람을 위해 조건을 명시적으로 작성하는 방향을 선호합니다.
if not arr: 보다는 if len(arr) == 0: 처럼요.
if not flag: 대신 if flag is False: 같은 예시도 있겠네요.
제 기준에 따르면 all([[]]) 는 all([조건식 for ... in []]) 로 고쳐 쓰는 게 코드를 더 잘 읽히게 해줄 테고요.
아~ python에서는 빈 리스트가 falsy values라서 all([[]]) 리턴 값이 False가 되는거군요. 언어마다 Truthy, Falsy values가 달라서 다른 언어를 할 때, 한 번씩 실수를 하네요. :)
참고로 Elixir는 nil 또는 false만 Falsy values라서 Enum.all?([[]]) 값은 true가 나와요.