다음 구문의 이해가 잘 안되서 조언 부탁드리고 싶습니다
def unit_propagate(clauses, symbol):
output = []
for c in clauses:
if not isinstance(c, Or):
output.append(c)
continue
for arg in c.args:
if arg == ~symbol:
output.append(Or(*[x for x in c.args if x != ~symbol]))
break
if arg == symbol:
break
else:
output.append(c)
return output
다른 부분이 아니라 저 output.append(Or(*[x for x in c.args if x!= ~ symbol]))를 어떻게 해석해야 하는지를 잘 모르겠습니다
output list 뒤에 append method를 실행하는건 알겠는데..... 저 내부의 내용을 어떻게 해석해야할지 ㅠㅠ
Or은 sympy module 내부에 있는 class Or입니다 (>>> from sympy.logic.boolage import Or 이 된 상태입니다)
symbol은 하나의 ATOM으로써 True or False 의 값을 가지고 있습니다.
clauses는 bound 된 ATOM들의 집합이구요(배열 내부에 저장중입니다)
해석 좀 부탁드리겠습니다 ㅠ
일단 대략 문맥상 Or는 boolean값들을 인자로 받는 함수고, 예를들어서 Or(True, False, True, ..) 이런식으로 해서 reduce 하는 것 같고, 결과물은 역시 boolean 일듯. 뭐 어쨌든 결과적으로는 c가 Or 절이면 c의 argument들을 모두 Or로 reduce한 값을 반환하라는 뜻 같네. x !=~symbol인건 넘어온 symbol하고 같은 truth value일 때만 Or에 포함시키라는... 뭐 그런..
졸려서 횡설수설임. 재밌는거 하는거 같은데 혹시 중요한거면 내일 다시
저 코드를 이해하려면 Python의 list comprehension이랑 가변 길이 인자에 대해서 알고 있어야 함. 일단 list comprehension에 대해서 간단히 설명하자면, Python의 for 문은 제어 구문이지만 List comprehension으로도 사용할 수 있음. 한 줄로 쓰는 for 문 같은 거임. [0, 1, 2, 3, 4, 5, ..., 48, 49] 이렇게 일일이 50개 칠 걸 [x for x in range(50)] 같이 줄일 수 있다.
그리고 Python에서 함수를 선언할 때 매개 변수(parameter) 이름 앞에 *를 붙이면 가변 인자가 된다. 예를 들어서 def test(*var): print var 라는 함수를 선언했으면 test(1, 2, 3) 이렇게 호출할 수 있고 이럴 경우 저 함수의 var 매개 변수에는 (1, 2, 3)이라는 튜플 형식이 대입됨. 저런 형식의 매개 변수에 한해서 호출할 때 인자를 일일이 주는 대신 test(*list) 식으로 쓰는 걸 허용한다. 다시 말해 test(*[1, 2]) == test(1, 2)라는 거.
이제 니가 질문한 Or(*[x for x in c.args if x != ~symbol]) 부분을 보자. Or는 sympy.logic.boolalg에 정의되어 있는데 뭐 이름에서도 알 수 있듯이 주어진 인자들에 대해서 boolean evaluation 수행 후 논리합(OR) 연산을 한 결과를 boolean type으로 리턴한다는 걸 추측할 수 있지. 예컨대 Or(True, False)하면 True가 리턴되고 Or(False, False)하면 False가 리턴되는 거야.
받아들일 수 있는 인자 개수가 무제한인 가변 인자이기 때문에 이 함수도 * 붙은 매개 변수로 선언되어 있어. 그래서 Or(*[x for ...]) 꼴이 가능해 지는 건데 for 뒤에 if를 붙여서 x != ~symbol가 만족하지 않는 c.args의 item들만 list로 만들어서 Or에 가변 인자로 넘기면서 호출하는 거임. 근데 symbol이 True나 False 중의 하나라면 x != ~symbol이 아니라 x != not symbol이어야 할 거 같은데 이 부분은 잘 모르겠다.
~는 bitwise NOT operator이고 not이 logical NOT operator여서... 저 경우에는 not operator가 필요해 보임...
감사합니다