리스트 처리

리스트 처리

리스트를 조작하는 부트스트랩 술어들을 설명해요.

출처: GNU Prolog Manual - List processing

본문

이 술어들은 리스트를 조작해요. 이들은 부트스트랩 술어(즉 Prolog로 작성됨)이고 (현재로서는) 오류 사례가 테스트되지 않아요. 그러나 다른 내장 술어를 사용해 Prolog로 작성됐으므로 그 내장 술어들로 인해 일부 오류가 발생할 수 있어요.

append/3

Templates

append(?list, ?list, ?list)

Description append(List1, List2, List12)는 리스트 List1과 리스트 List2의 결합이 리스트 List12이면 성공해요. 이 술어는 백트래킹 시 재실행 가능해요(예: List12가 인스턴스화되고 List1과 List2가 모두 변수인 경우).

Errors: 없음.

Portability: GNU Prolog 술어.

member/2, memberchk/2

Templates

member(?term, ?list)
memberchk(?term, ?list)

Description member(Element, List)는 Element가 List에 속하면 성공해요. 이 술어는 백트래킹 시 재실행 가능하므로 List의 요소를 열거하는 데 사용될 수 있어요. memberchk/2member/2와 비슷하지만 한 번만 성공해요.

Errors: 없음.

Portability: GNU Prolog 술어.

reverse/2

Templates

reverse(?list, ?list)

Description reverse(List1, List2)는 List2가 리스트 List1과 역순으로 통일하면 성공해요.

Errors: 없음.

Portability: GNU Prolog 술어.

delete/3, select/3

Templates

delete(?list, ?term, ?list)
select(?term, ?list, ?list)

Description

  • delete(List1, Element, List2) — List2를 제공하기 위해 List1에서 Element의 모든 발생을 제거. 엄격한 항 동일성이 요구됨. (==)/2(8.3.2절) 참조.
  • select(Element, List1, List2) — List2를 제공하기 위해 List1에서 Element의 한 발생을 제거. 이 술어는 백트래킹 시 재실행 가능.

Errors: 없음.

Portability: GNU Prolog 술어.

subtract/3

Templates

subtract(+list, +list, ?list)

Description subtract(List1, List2, List3)는 List2의 모든 요소를 List1에서 제거해 List3을 제공해요. 소속 여부는 memberchk/2(8.20.2절)를 사용해 테스트돼요. 이 술어는 O(|List2| × |List1|)로 실행돼요.

Errors: 없음.

Portability: GNU Prolog 술어.

permutation/2

Templates

permutation(?list, ?list)

Description permutation(List1, List2)는 List2가 List1 요소들의 순열이면 성공해요. 이 술어는 백트래킹 시 재실행 가능해요.

Errors: 없음.

Portability: GNU Prolog 술어.

prefix/2, suffix/2

Templates

prefix(?list, ?list)
suffix(?list, ?list)

Description

  • prefix(Prefix, List) — Prefix가 List의 접두사이면 성공. 이 술어는 백트래킹 시 재실행 가능.
  • suffix(Suffix, List) — Suffix가 List의 접미사이면 성공. 이 술어는 백트래킹 시 재실행 가능.

Errors: 없음.

Portability: GNU Prolog 술어.

sublist/2

Templates

sublist(?list, ?list)

Description sublist(List1, List2)는 List1의 모든 요소가 List2에 같은 순서로 나타나면 성공해요. 이 술어는 백트래킹 시 재실행 가능해요.

Errors: 없음.

Portability: GNU Prolog 술어.

last/2

Templates

last(?list, ?term)

Description last(List, Element)는 Element가 List의 마지막 요소이면 성공해요.

Errors: 없음.

Portability: GNU Prolog 술어.

flatten/2

Templates

flatten(?term, ?list)

Description flatten(List1, List2)는 List2가 List1의 평면화(flatten) 버전이면 성공해요.

Errors: 없음.

Portability: GNU Prolog 술어.

length/2

Templates

length(?list, ?integer)

Description length(List, Length)는 Length가 List의 길이이면 성공해요.

Errors

  • Length가 0보다 작은 정수 — domain_error(not_less_than_zero, Length)

Portability: GNU Prolog 술어.

nth/3

Templates

nth(?integer, ?list, ?term)

Description nth(N, List, Element)는 List의 N번째 인자가 Element이면 성공해요.

Errors: 없음.

Portability: GNU Prolog 술어.

max_list/2, min_list/2, sum_list/2

Templates

min_list(+list, ?number)
max_list(+list, ?number)
sum_list(+list, ?number)

Description

  • min_list(List, Min) — Min이 List에서 가장 작은 숫자이면 성공.
  • max_list(List, Max) — Max가 List에서 가장 큰 숫자이면 성공.
  • sum_list(List, Sum) — Sum이 List의 모든 요소의 합이면 성공.

List는 산술 평가 가능한 항들의 리스트여야 해요(8.6.1절).

Errors: 없음.

Portability: GNU Prolog 술어.

maplist/2-8

Templates

maplist(+callable_term, +list,…, +list)

Description

  • maplist(Goal, List) — Goal이 List의 모든 요소에 성공적으로 적용될 수 있으면 성공.
  • maplist(Goal, List1, List2) — Goal이 List1과 List2 요소의 모든 쌍에 성공적으로 적용될 수 있으면 성공.
  • maplist(Goal, List1, List2, List3) — Goal이 List1..List3 요소의 모든 삼중에 성공적으로 적용될 수 있으면 성공.
  • maplist(Goal, List1, List2,…, ListN) — Goal이 List1..ListN 요소의 모든 N-중(N ≤ 8)에 성공적으로 적용될 수 있으면 성공.

Errors

  • 지시자를 실행하는 동안 오류 발생 — call/1 오류 참조(7.2.3절)

Portability: GNU Prolog 술어.

sort/2, msort/2, keysort/2, sort/1, msort/1, keysort/1

Templates

sort(+list, ?list)
msort(+list, ?list)
keysort(+list, ?list)
sort(+list)
msort(+list)
keysort(+list)

Description

  • sort(List1, List2) — List2가 중복 요소가 병합된 List1에 대응하는 정렬된 리스트이면 성공.
  • msort/2sort/2와 비슷하지만 중복 요소가 병합되지 않음.
  • keysort(List1, List2) — List2가 키에 따른 List1의 정렬된 리스트이면 성공. 리스트 List1은 쌍(Key-Value 형태의 항)으로 구성돼요. 이 항들은 Key 값에 따라 정렬되어 List2를 산출해요. 중복 키는 병합되지 않아요. 이 술어는 안정적이에요. 즉 입력에서 K-A가 K-B보다 먼저 나오면 출력에서도 K-A가 K-B보다 먼저 나와요.
  • sort/1, msort/1, keysort/1 — 각각 sort/2, msort/2, keysort/2와 비슷하지만 원래 List1을 파괴해 제자리 정렬을 이룸(이 제자리 할당은 백트래킹 시 취소되지 않음). 정렬된 리스트는 원래 리스트와 같은 메모리 공간을 차지해 메모리 소비를 절약해요.

이 정렬들의 시간 복잡도는 O(N log N)이며, N은 정렬할 리스트의 길이예요. 이 술어들은 항의 표준 순서를 참조해요(8.3.1절).

Errors

  • List1이 부분 리스트 — instantiation_error
  • List1이 부분 리스트도 리스트도 아님 — type_error(list, List1)
  • List2가 부분 리스트도 리스트도 아님 — type_error(list, List2)
  • keysort/2의 경우: List1의 어떤 요소가 변수 — instantiation_error
  • keysort/2의 경우: List1의 어떤 요소 E가 변수도 쌍도 아님 — type_error(pair, E)
  • keysort/2의 경우: List2의 어떤 요소 E가 변수도 쌍도 아님 — type_error(pair, E)

Portability: sort/2keysort/2는 ISO 술어. sort/1, keysort/1, msort/1-2는 GNU Prolog 술어.

더 알아보기