리스트 처리
리스트 처리
리스트를 조작하는 부트스트랩 술어들을 설명해요.
본문
이 술어들은 리스트를 조작해요. 이들은 부트스트랩 술어(즉 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/2는 member/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/2—sort/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_errorkeysort/2의 경우: List1의 어떤 요소 E가 변수도 쌍도 아님 —type_error(pair, E)keysort/2의 경우: List2의 어떤 요소 E가 변수도 쌍도 아님 —type_error(pair, E)
Portability: sort/2와 keysort/2는 ISO 술어. sort/1, keysort/1, msort/1-2는 GNU Prolog 술어.