Written by JS970
on
on
프로그래밍언어론 2023-04-13 수업정리
Flow
- Review
- Prolog Intro
- SWI-Prolog & Demo
Review
- Axiomatic System(공리계)
- 공리의 유한 집합, 사실(fact)과 추론 규칙(rules)로 구성된다.
- 사실(predicate) : 아래와 같이 표현 가능하다. 항상 참이다.$$\frac{true}{fact}$$
- 추론 규칙(rules) : 가정(hypothetics) 술어들을 바탕으로 결론 술어를 도출해 내는 규칙이다. 아래와 같이 표현 가능하다.$$\frac{predicate^{\ *}}{predicate}$$$$predicate^{\ *} \models predicate$$
- 공리의 유한 집합, 사실(fact)과 추론 규칙(rules)로 구성된다.
- Hoare Logic$${P}\ S\ {Q}$$
- P, S, Q를 묶어서 Hoare Triple이라고 한다.
- P : 사전조건(input spec)
- Q : 사후조건(output spec)
- output spec으로부터 input spec이 derive된다면 올바른 program이다. 이때 input spec P의 최약 사전 조건(weakest Precondition)을 Axiomatic System을 통해 찾을 수 있다.
- output spec으로부터 input spec을 derive 할 수 있음을 증명하기 위해 몇 가지 Axiom을 배웠다.
- Assignment Axiom
- The rule of consequence
- The rule of compostion
- The rule of selection
- The rule of iteration
- 특히 rule of iteration에서는 Invarient Variable I를 찾는 과정이 중요했다. I가 숨겨져 있으므로 직관적으로 판단하기가 힘들었다.
Prolog Intro
Prolog History
- 1972년에 Alain Colmerauer와 Philippe Roussel이 만든 언어
- 1979년에 Kowalski의 논문 Algorithm = Logic + Control, CACM에 의해 널리 알려졌다.
- 일본 정부에서 5세대 프로젝트의 기본 언어로 채택하는 등 나름 영향력이 있었다.
Prolog Resources
- Prolog Env
- Prolog Docs
- Prolog Books
Procedural Language vs Declarative Language
- Procedural Language(순차적 프로그래밍 언어) : BASIC, FORTRAN, C++, Pascal, Java ...
- computational step을 하나하나 명시해야 한다.
- 이때 computational step이란 instruction, statement, procedure을 통한 계산 과정이다.
- 어떻게(how) 문제를 풀어야 하는지 기술한다.
- Declarative Language(선언적 프로그래밍 언어) : LISP, Prolog, ML ...
- computational rules를 명시한다.
- fact는 computational rules의 special cases이다.
- 무엇(what)을 풀어야 하는지 기술한다.
- Procedural Language, Declarative Language가 how와 what의 차이를 보이기는 하지만, 현실에서는 이 둘이 항상 확실히 구별되지는 않는다.
- 순차적 언어에도 what에 대한 특징이 있다.(타입 선언)
- 선언적 언어에도 how에 대한 특징이 있다.(Prolog의 cut)
Computational Model of Prolog
- 1차 술어 계산(1st-order predicate calculus)을 기반으로 한다.
- Rules(규칙) : Horn clause(Horn 절)을 이용하여 표시한다.
- Horn절은 Conjunctive Normal Form으로 생각하면 이해하기 쉽다.
interesting(L) :- lectureByWoo(L), language(L).
- Fact(사실) : 아무 조건 없이 성립하는 명제
fact.
- goal(질의) : 사실인지 확인하고 싶은 명제
- 질의의 결과는 참(true)또는 거짓(false)이다.
-? goal.
- 아래는 사실, 규칙, 질의 과정을 포함하는 Prolog 프로그램의 예시이다.
lectureByWoo(prolog).
lectureByWoo(scheme).
language(prolog).
language(scheme).
interesting(L) :- lectureByWoo(L), language(L).
- 실행 결과
?- interesting(prolog).
true.
?- interesting(scheme).
true.
?- interesting(cpp).
false.
SWI-Prolog & Demo
- 프로그램 소스 편집
?- edit(file('filename.pl')).
- 프로그램 파일 참조(load)
- 두 표현은 같은 표현이다.
?- consult(filename).
?- [filename].
- 질의(목적의 명시)
- 당연하지만 parent rule이 명시되어 있어야 아래와 같은 질의가 가능하다.
- 답변에 만족했다면 질의 이후 "Enter" 입력
- 답변에 만족하지 않았다면 ";" 를 입력하여 계속 질의
?- parent(X, jim).
- 해석기 종료
?- halt.
Basic SWI-Prolog Commands
- 아래 명령어들은 SWI에만 특별히 존재하는 명령어이다. 리눅스 명령어에서 따옷 듯 하다.
- pwd : 현재 디렉토리 출력
- cd : 현재 디렉토리 변경
- ls : 현재 디렉토리 파일 list
- help : 특정 topic에 관한 도움말
- edit : 파일 열기