산술과 리스트

반복문이 없는데 리스트 두 개를 어떻게 이을까?

산술

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를 그대로 씁니다.

교재의 예입니다. 아래 리스트는 예시입니다.

다음 편

잘 되는 것만 보았습니다. Prolog가 못 하는 것도 있습니다

9편Prolog가 못 하는 것은 무엇일까? 15강 목록