Butterfly라는 프로그래밍 언어를 만들고 있는 중에 문제가 발생해서 여쭙니다.
일단, 이 논리형 언어를 소개할게요. 논리형 언어이지만 한정사(quantifier)나 결합자(connective)는 없습니다.
먼저 기본적인 객체로는 생성자(constructor), 변수(variable), 술어(Predicate), 형(Type)이 있습니다.
값: n항 생성자가 n개의 값과 결합한 것이며 한 값은 한 타입에만 속합니다.
항: 변수 그 자체이거나 n항 생성자가 n개의 항들과 결합한 것입니다.
명제: n항 술어가 n개의 값과 결합한 것입니다.
식: n항 술어가 n개의 항과 결합한 것입니다.
공리: 0개 이상의 식들을 전제들로, 1개의 식을 결론으로 가집니다.
예를 들어 타입 Nat을 다음과 같이 정의합시다.
Nat ::= zero( ), succ( Nat ).
그러면 zero( ), succ( zero( ) ), succ( succ( zero( ) ) ), ... 등은 모두 Nat에 속하는 서로 다른 값들입니다.
그리고 1항 술어 Even에 대하여 Even( x )와 Even( succ( succ( x ) ) )은 적법한 식입니다.
원래 타입이 맞아야 적법한 항이 되고 식이 되지만 여기서는 타입이 항상 맞다고 가정하겠습니다.
변수배정은 한 식에 있는 모든 변수를 값으로 치환하여 그 식을 명제로 바꾸는 행위입니다.
명제 A에 대하여 적당한 공리와 그 공리에 대한 변수배정이 존재하여
변수배정된 공리의 결론이 A와 같고 변수 배정된 전제들이 모두 증명가능하면 A는 증명가능합니다.
Butterfly 인터프리터는 사용자가 코딩한 공리들을 해석하여 사용자가 질의한 명제가 증명가능한지 알려줍니다.
예를 들어 다음과 같이 코딩했다고 합시다. (공리는 '전제1, ..., 전제n / 결론' 꼴로 코딩됩니다.)
/ Even( zero( ) ).
Even( x ) / Even( succ( succ( x ) ) ).
그런데 자유 변수들을 정의하면 그것들이 있는 식이 증명가능한지 알려줄 수 있습니다.
예를 들어 자유변수 a와 b를 다음과 같이 정의할 수 있습니다.
a : Nat.
b : Nat.
a → zero( ), succ( b ).
b → succ( a ).
제 생각에는 귀납법을 변형해야할 것 같습니다.
제 생각에는 Even( a )가 증명가능할 때 그리고 그럴 때에만 다음 두 논리식 모두 참일 것 같습니다.
- ∀a [ Even( a ) → Even( zero( ) ) ].
- ∀a [ Even( a ) → ∀b [ Even( b ) → Even( succ( succ( a ) ) ) ] ].
이게 맞나요? 즉, 자유변수 x : T와 항 t : T에 대하여
변수 정의 x → t에서 논리식 ∀x [ φ → φ[x := t] ]를 얻을 수 있나요?
제 생각에는 이게 귀납법과 비슷해서 제목을 그렇게 썼습니다.
아무튼 긴 글 읽어주셔서 감사하고 고민해 주시면 더욱 감사하겠습니다.
그리고 이것의 구현까지 고민해주시면 더더욱 감사하겠습니다.
a,b를 왜 저렇게 정의했는지 3,4번째 줄이 이해가 안가요..
a -> succ( b ) -> succ( succ( a ) ) -> succ( succ( zero( ) ) ). 이런 식으로 유도되는 겁니다. 형식문법에서 문자열을 유도하는 것과 비슷해요.
근데 뭐가 문제인건지 잘 모르겠어요.... 질문이 알게 모르게 글에 많이 들어가있는데
글 쓰고 있어요. 기다려 주세요.
뭔말인지.. 보통의 수학 공부하는 사람은 못알아들을듯
죄송합니다.