산술과 리스트
반복문이 없는데 리스트 두 개를 어떻게 이을까?
산술
is가 계산해서 묶어 줍니다
Prolog는 정수 변수와 정수 산술을 지원합니다. is 연산자는 오른쪽 산술식을 계산해 그 값을 왼쪽 변수에 묶습니다.
식 A is B / 17 + C는 이 강의가 따르는 교재의 예입니다. B와 C의 값은 예시 값입니다. 34 / 17은 2이고, 2 + 3은 5입니다.
대입문이 아닙니다
묶인 변수는 다시 못 묶습니다
is는 대입문처럼 보이지만 다릅니다. 이미 값이 묶인 변수에는 새 값을 넣을 수 없습니다. 그래서 Sum is Sum + Number는 쓸 수 없는 문장입니다.
Sum is Sum + Number는 교재의 예입니다. 10과 3은 예시 값입니다. 대입문은 1강에서 본, 변수에 값을 넣는 문장입니다.
리스트
머리와 꼬리로 가릅니다
리스트(list)는 요소를 순서대로 늘어놓은 것입니다. 대괄호 안에 쉼표로 나눠 적습니다. [X | Y]와 맞추면 첫 요소가 머리 X에, 나머지 리스트가 꼬리 Y에 묶입니다.
교재의 예입니다. 요소는 원자, 원자 명제, 다른 리스트일 수 있습니다. 머리는 첫 요소 하나이고, 꼬리는 나머지 리스트입니다.
append
잇는 절차가 아니라 관계를 적습니다
append(A, B, C)는 'A에 B를 이으면 C'라는 관계입니다. 둘째 규칙은 몸에서 자기 자신을 다시 부릅니다. 4강에서 본 재귀입니다.
교재의 예입니다. 화면 폭에 맞춰 줄을 나눠 적었습니다. Head, List_1 같은 이름은 대문자로 시작하므로 변수입니다.
append가 답을 찾는 길
머리를 떼며 내려가고, 붙이며 올라옵니다
첫 리스트의 머리를 하나씩 떼어 가며 규칙 2가 자기 자신을 부릅니다. 첫 리스트가 비면 규칙 1에 닿습니다. 거기서부터 떼어 둔 머리를 다시 붙이며 올라옵니다.
목표는 예시입니다. 요소는 앞 장의 리스트에서 가져왔습니다.
member
머리와 견주고, 아니면 꼬리로
member는 어떤 요소가 리스트에 들어 있는지를 적은 관계입니다. 찾는 것이 머리와 같으면 참입니다. 아니면 꼬리에서 다시 찾습니다.
교재의 예입니다. 밑줄 _ 은 익명 변수(anonymous variable)로, 무엇이 묶이든 상관없는 자리에 씁니다. 아래의 찾는 예는 예시입니다.
reverse
꼬리를 뒤집고 머리를 끝에 잇습니다
reverse는 리스트를 뒤집은 관계입니다. 빈 리스트를 뒤집으면 빈 리스트입니다. 그 밖에는 꼬리를 뒤집은 것 끝에 머리를 이으면 됩니다. 앞에서 본 append를 그대로 씁니다.
교재의 예입니다. 아래 리스트는 예시입니다.
다음 편