항 처리
항 처리
Prolog 항을 처리하는 내장 술어들을 설명해요.
본문
functor/3
Templates
functor(+nonvar, ?atomic, ?integer)
functor(-nonvar, +atomic, +integer)
Description
functor(Term, Name, Arity)는 Term의 주 functor가 Name이고 아리티가 Arity이면 성공해요. 이 술어는 두 가지 방법으로 쓸 수 있어요:
Term이 변수가 아닌 경우:Term의 이름(Term이 숫자이면 원자 또는 숫자)과 아리티를 추출(Term이 원자이면Arity = 0).Term이 변수인 경우:Term을 주 functor가Name이고 아리티가Arity인 일반 항과 통일.
Errors
Term과Name이 모두 변수 -instantiation_errorTerm과Arity이 모두 변수 -instantiation_errorTerm이 변수이고Name이 변수도 원자 항도 아님 -type_error(atomic, Name)Term이 변수이고Arity가 변수도 정수도 아님 -type_error(integer, Arity)Term이 변수이고Name이 상수지만 원자가 아니고Arity가 정수 > 0 -type_error(atom, Name)Term이 변수이고Arity가max_arity플래그(8.22.1절)보다 큰 정수 -representation_error(max_arity)Term이 변수이고Arity가 정수 < 0 -domain_error(not_less_than_zero, Arity)
Portability: ISO 술어.
arg/3
Templates
arg(+integer, +compound_term, ?term)
Description
arg(N, Term, Arg)는 Term의 N 번째 인자가 Arg이면 성공해요.
Errors
N이 변수 -instantiation_errorTerm이 변수 -instantiation_errorN이 변수도 정수도 아님 -type_error(integer, N)Term이 변수도 복합 항도 아님 -type_error(compound, Term)N이 정수 < 0 -domain_error(not_less_than_zero, N)
Portability: ISO 술어.
(=..)/2 - univ
Templates
=..(+nonvar, ?list)
=..(-nonvar, +list)
Description
Term =.. List는 List가 Term의 주 functor에 해당하는 원자를 머리(head)로, Term의 인자들의 리스트를 꼬리(tail)로 갖는 리스트이면 성공해요.
=..는 미리 정의된 중위 연산자예요(8.14.10절).
Errors
Term이 변수이고List가 부분 리스트 -instantiation_errorList가 부분 리스트도 리스트도 아님 -type_error(list, List)Term이 변수이고List가 머리가 변수인 리스트 -instantiation_errorList가 머리 H가 원자도 변수도 아니고 꼬리가 빈 리스트가 아닌 리스트 -type_error(atom, H)List가 머리 H가 복합 항이고 꼬리가 빈 리스트인 리스트 -type_error(atomic, H)Term이 변수이고List가 빈 리스트 -domain_error(non_empty_list, [])Term이 변수이고List의 꼬리 길이가max_arity플래그(8.22.1절)보다 큼 -representation_error(max_arity)
Portability: ISO 술어.
copy_term/2
Templates
copy_term(?term, ?term)
Description
copy_term(Term1, Term2)는 Term2가 Term1의 이름을 바꾼 복사본(renamed copy)인 항 T와 통일되면 성공해요.
Errors: 없음.
Portability: ISO 술어.
term_variables/2, term_variables/3
Templates
term_variables(?term, ?list)
term_variables(?term, ?list, ?list)
Description
term_variables(Term, List)는 List가 Term의 고유한 각 변수와 공유하는 변수들(FD 변수 포함)의 리스트와 통일되면 성공해요. List의 변수들은 Term을 깊이 우선·왼쪽에서 오른쪽으로 탐색하며 나타난 순서대로 정렬돼요.
term_variables(Term, List, Tail)은 위 술어의 차이 리스트(difference-list) 버전이에요. 즉 Tail은 변수 리스트 List의 꼬리예요.
Errors
term_variables/2에서List가 부분 리스트도 리스트도 아님 -type_error(list, List)
Portability: term_variables/2는 ISO 술어. term_variables/3은 GNU Prolog 술어.
subsumes_term/2
Templates
subsumes_term(?term, ?term)
Description
subsumes_term(General, Specific)는 General의 변수를 바인딩하여(단 Specific는 영향받지 않고) General을 Specific과 동등하게 만들 수 있으면 성공해요. 현재 구현은 (occurs check를 수행한) 통일을 수행하고, 통일에 의해 (그다음 되돌려지는) Specific의 변수 집합이 변경되지 않음을 보장해요.
이 술어는 Specific에 FD 변수가 있으면 실패한다는 점을 주의하세요.
Errors: 없음.
Portability: ISO 술어.
acyclic_term/1
Templates
acyclic_term(?term)
Description
acyclic_term(Term)은 Term이 순환(cyclic) (하위)항을 포함하지 않으면 성공해요. 이 경우 Term은 안전하게 처리될 수 있어요. acyclic_term(Term)이 실패하면 Term은 순환을 포함하고 처리가 안전하지 않아요. GNU Prolog는 순환 항의 통일을 지원하지 않지만 그 생성은 허용하기 때문이에요. 순환은 그 생성에 걸쳐 실패함으로써 안전하게 되돌릴 수 있어요. 따라서 acyclic_term/1의 사용은 순환 항에 대해 중요한 술어들을 보호하는 데만 한정해야 해요.
Errors: 없음.
Portability: ISO 술어.
term_hash/4, term_hash/2
Templates
term_hash(?term, +integer, +integer, ?integer)
term_hash(?term, ?integer)
Description
term_hash(Term, Depth, Range, Hash)는 Hash가 Term의 해시 코드이면 성공해요. Term이 접지되지 않았으면(ground/1(8.1.1절) 참조) 이 술어는 그냥 성공해요(Hash는 통일되지 않음).
Depth는 Term을 스캔할 깊이 제한이에요(최상위 항에 대해 1부터 시작). Depth = 0이면 아무것도 해시되지 않고, 1이면 원자 항과 주 functor/아리티만 해시되고, Depth = -1이면 전체 항이 고려돼요.
해시 코드는 다음과 같아요: 0 ≤ Hash < Range. Range = 0이면 Hash는 제한되지 않아요(현재 < 268435456).
term_hash(Term, Hash)는 term_hash(Term, -1, 0, Hash)와 동일해요.
참고: 계산된 해시 코드는 어떤 실행 문맥과도 무관해요(즉 서로 다른 실행에서 일정). 또한 기반 머신과도 무관해요. 이 술어들은 해시 테이블이나 인자 인덱싱을 구현하는 데 유용해요.
Errors
Depth가 변수 -instantiation_errorDepth가 변수도 정수도 아님 -type_error(integer, Depth)Range가 변수 -instantiation_errorRange가 변수도 정수도 아님 -type_error(integer, Range)Range가 정수 < 0 -domain_error(not_less_than_zero, Range)Hash가 변수도 정수도 아님 -type_error(integer, Hash)
Portability: GNU Prolog 술어.
setarg/4, setarg/3
Templates
setarg(+integer, +compound_term, +term, +boolean)
setarg(+integer, +compound_term, +term)
Description
setarg(N, Term, NewValue, Undo)는 Term의 N 번째 인자를 NewValue로 파괴적으로(destructively) 대체해요. Undo = true이면 이 할당은 백트래킹 시 되돌려져요. 이 술어는 대체된 인자의 이전 값이 더 이상 사용되지 않을 때만 사용해야 해요. Undo = false이면 NewValue는 원자 또는 정수여야 해요.
setarg(N, Term, NewValue)는 setarg(N, Term, NewValue, true)와 동일해요.
Errors
N이 변수 -instantiation_errorN이 변수도 정수도 아님 -type_error(integer, N)N이 정수 < 0 -domain_error(not_less_than_zero, N)Term이 변수 -instantiation_errorTerm이 변수도 복합 항도 아님 -type_error(compound, Term)NewValue가 원자도 정수도 아니고Undo = false-type_error(atomic, NewValue)Undo가 변수 -instantiation_errorUndo가 변수도 부울도 아님 -type_error(boolean, Undo)
Portability: GNU Prolog 술어.