짤은 직관주의 1계 논리인데 알 필요는 없어.
내가 설명하고자 하는 건 기다란 선의 의미야:
선 위에 있는 모든 식들을 유도할 수 있을 때,
선 밑에 있는 식을 유도할 수 있다.
참 간단하지?
선 하나하나는 논리형 프로그래밍에서의 Rule이야.
인터프리터에게 식을 주면
인터프리터는 Rule을 이용하여
주어진 식을 유도할 수 있는지를 알려줘.
이게 논리형 프로그래밍의 전부야.
나만의 언어에서 기다란 선은 "/"로 치환되었어.
즉, Rule의 형태는 a_1, ..., a_n / b의 꼴이고,
여기서 a_1, ..., a_n, b는 Formula야.
Formula가 뭐냐면 식에 대한 자료형으로,
Predicate의 Term과의 결합이야.
이 두 개념이 뭔지는 다음 코드를 보고 나면 말해줄게.
/ Father( "A", "B" ).
/ Father( "B", "C" ).
/ Father( "C", "D" ).
Father( x, y ) / Family( x, y ).
/ Family( x, x ).
Family( x, y ) / Family( y, x ).
Family( x, y ), Family( y, z ) / Family( x, z ).
Predicate Father의 해석은 "왼쪽 Term과 오른쪽 Term의 관계가 부자관계인가?"이고,
Predicate Family의 해석은 "왼쪽 Term과 오른쪽 Term이 같은 가문인가?"이야.
감이 잡히지?
더 자세히 설명할게, 기다려줘.
나만의 언어는 타입이 있는 언어야.
타입은 생성자의 집합에 대응되고,
값은 생성자들의 결합인데 문자열에 대응된다.
자연수를 타입으로 정의해보자.
Nat
{
zero() → "z".
succ(Nat) → "s" 1.
}
0항 생성자 zero()와 1항 생성자 succ()으로
타입 Nat을 정의해봤어.
예를 들어, succ(succ(zero()))는 Nat의 값이며,
문자열 "ssz"에 대응된다.
Term은 값과 변수의 결합이야.
예를 들어 n : Nat에 대하여 succ(n) : Nat은 항이야.
이제 1번째 항과 2번째 항의 합이 3번째 항이 되도록
Predicate Plus를 정의해볼게.
/ Plus( x, zero(), x ).
Plus( x, y, z ) / Plus( x, succ( y ), succ( z ) ).
만약 인터프리터에게 Plus( "sz", "z", "sz" )라고 물으면 yes라 답하고, Plus( "sz", x, "ssz" )라고 물으면 x = "sz"라고 답하고, Plus( "sz", y, "z" )라고 물으면 그런 y는 존재하지 않는다고 답해.
문제는 내가 이것을 효율적으로 구현하는 법을 모른다는 거야. 너희들의 도움이 필요해.
내가 설명하고자 하는 건 기다란 선의 의미야:
선 위에 있는 모든 식들을 유도할 수 있을 때,
선 밑에 있는 식을 유도할 수 있다.
참 간단하지?
선 하나하나는 논리형 프로그래밍에서의 Rule이야.
인터프리터에게 식을 주면
인터프리터는 Rule을 이용하여
주어진 식을 유도할 수 있는지를 알려줘.
이게 논리형 프로그래밍의 전부야.
나만의 언어에서 기다란 선은 "/"로 치환되었어.
즉, Rule의 형태는 a_1, ..., a_n / b의 꼴이고,
여기서 a_1, ..., a_n, b는 Formula야.
Formula가 뭐냐면 식에 대한 자료형으로,
Predicate의 Term과의 결합이야.
이 두 개념이 뭔지는 다음 코드를 보고 나면 말해줄게.
/ Father( "A", "B" ).
/ Father( "B", "C" ).
/ Father( "C", "D" ).
Father( x, y ) / Family( x, y ).
/ Family( x, x ).
Family( x, y ) / Family( y, x ).
Family( x, y ), Family( y, z ) / Family( x, z ).
Predicate Father의 해석은 "왼쪽 Term과 오른쪽 Term의 관계가 부자관계인가?"이고,
Predicate Family의 해석은 "왼쪽 Term과 오른쪽 Term이 같은 가문인가?"이야.
감이 잡히지?
더 자세히 설명할게, 기다려줘.
나만의 언어는 타입이 있는 언어야.
타입은 생성자의 집합에 대응되고,
값은 생성자들의 결합인데 문자열에 대응된다.
자연수를 타입으로 정의해보자.
Nat
{
zero() → "z".
succ(Nat) → "s" 1.
}
0항 생성자 zero()와 1항 생성자 succ()으로
타입 Nat을 정의해봤어.
예를 들어, succ(succ(zero()))는 Nat의 값이며,
문자열 "ssz"에 대응된다.
Term은 값과 변수의 결합이야.
예를 들어 n : Nat에 대하여 succ(n) : Nat은 항이야.
이제 1번째 항과 2번째 항의 합이 3번째 항이 되도록
Predicate Plus를 정의해볼게.
/ Plus( x, zero(), x ).
Plus( x, y, z ) / Plus( x, succ( y ), succ( z ) ).
만약 인터프리터에게 Plus( "sz", "z", "sz" )라고 물으면 yes라 답하고, Plus( "sz", x, "ssz" )라고 물으면 x = "sz"라고 답하고, Plus( "sz", y, "z" )라고 물으면 그런 y는 존재하지 않는다고 답해.
문제는 내가 이것을 효율적으로 구현하는 법을 모른다는 거야. 너희들의 도움이 필요해.
- 희망의 등불
하스켈이 더 쉽겠다
? - 훈다리 훈다리
하스켈에서 타입 정의를 형식문법과 비슷하게 하자나. 거기서 값을 문자열에 대응시킬 수 있겠다는 생각을 함. - 훈다리 훈다리
왜 타입이 문자열에 대응되는거임
일일이 생성자 치고 있기 귀찮아서 - 훈다리 훈다리
그리고 값이 문자열에 대응됨, 타입이 아니라. - 훈다리 훈다리
"s" 1은 또 뭐야
1은 첫번째 항에 대응되는 문자열을 나타냄. - 훈다리 훈다리
succ(succ(zero())) → "s" succ(zero()) → "s" "s" zero() = "s" "s" "z" = "ssz". - 훈다리 훈다리
그런식이면 26개밖에 대응안되는거 아니냐
아니다 Plus에 Nat를 받으니까 생성자 별칭으로 그렇게 넣는건가
그럼 여러 타입끼리 묶이면 어떻게 표현함
ㅇㅇ 문자열의 타입을 알아야만 생성자로 변환할 수 있고, 같은 문자열이 다른 타입의 값이 될 수 있음. 그러나 같은 타입의 다른 값이 될 수는 없음. - 훈다리 훈다리
아 succ에도 Nat을 받으니까 다음에 오는 s나 z가 Nat의 생성자라는걸 알수있구나 흠흠
아무튼 구현은 어떻게 할까? 그리고 진짜 함수를 추가할 수 있을까? - 훈다리 훈다리
사실 깊이우선탐색하는 Prolog라는 논리형 언어의 문제를 고치려고 만들었는데, 파싱기능도 넣으려고. 끌리지 않음? - 훈다리 훈다리
내가 prolog 했으면 몰라도 생판 처음이니 띠용하기만 함
참고로 분자에 어떤 식도 없는 Rule을 Fact라고도 부름. - 훈다리 훈다리
람다 주세요 현기증 날 것 같아요
6장,7장 올리라고요?
글쎄 다른거 생각 안하고 순전히 너님 생각대로만 풀어보면 plus는 '2, 3번째 인자는 얼마든지 "s"를 추가할 수 있다'정도의 의미같은데 x값이 어떻게 딱정해지는지 의문이네 - dc App
x + 0 = x, x + (y') = (x + y)'의 두 공리를 나타낸 것으로 이것만으로 덧셈을 계산할 수 있습니다. 여기서 '는 succ입니다. 읽어주셔서 감사하고, 이해 안 되시면 질문하세요. - 훈다리 훈다리
Plus( 3, 0, 3 ), Plus( 3, 1, 4 ), Plus( 3, 2, 5 ), .... - 훈다리 훈다리
아 애초에 첫줄을 만족안하면 두번째를 적용할 수 없다는 표현이구나
그렇죠. 분자에 있는 모든 식을 유도할 수 있을 때 분모에 있는 식을 유도할 수 있습니다. - 훈다리 훈다리
해당 댓글은 삭제되었습니다.
Natural Deduction이라고 영어 위키에 검색하세요. - 훈다리 훈다리