항 처리

항 처리

Prolog 항을 처리하는 내장 술어들을 설명해요.

출처: GNU Prolog Manual - Term processing

본문

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

  • TermName이 모두 변수 - instantiation_error
  • TermArity이 모두 변수 - instantiation_error
  • Term이 변수이고 Name이 변수도 원자 항도 아님 - type_error(atomic, Name)
  • Term이 변수이고 Arity가 변수도 정수도 아님 - type_error(integer, Arity)
  • Term이 변수이고 Name이 상수지만 원자가 아니고 Arity가 정수 > 0 - type_error(atom, Name)
  • Term이 변수이고 Aritymax_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_error
  • Term이 변수 - instantiation_error
  • N이 변수도 정수도 아님 - 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 =.. ListListTerm의 주 functor에 해당하는 원자를 머리(head)로, Term의 인자들의 리스트를 꼬리(tail)로 갖는 리스트이면 성공해요.

=..는 미리 정의된 중위 연산자예요(8.14.10절).

Errors

  • Term이 변수이고 List가 부분 리스트 - instantiation_error
  • List가 부분 리스트도 리스트도 아님 - type_error(list, List)
  • Term이 변수이고 List가 머리가 변수인 리스트 - instantiation_error
  • List가 머리 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)Term2Term1의 이름을 바꾼 복사본(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)ListTerm의 고유한 각 변수와 공유하는 변수들(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는 영향받지 않고) GeneralSpecific과 동등하게 만들 수 있으면 성공해요. 현재 구현은 (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)HashTerm의 해시 코드이면 성공해요. Term이 접지되지 않았으면(ground/1(8.1.1절) 참조) 이 술어는 그냥 성공해요(Hash는 통일되지 않음).

DepthTerm을 스캔할 깊이 제한이에요(최상위 항에 대해 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_error
  • Depth가 변수도 정수도 아님 - type_error(integer, Depth)
  • Range가 변수 - instantiation_error
  • Range가 변수도 정수도 아님 - 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_error
  • N이 변수도 정수도 아님 - type_error(integer, N)
  • N이 정수 < 0 - domain_error(not_less_than_zero, N)
  • Term이 변수 - instantiation_error
  • Term이 변수도 복합 항도 아님 - type_error(compound, Term)
  • NewValue가 원자도 정수도 아니고 Undo = false - type_error(atomic, NewValue)
  • Undo가 변수 - instantiation_error
  • Undo가 변수도 부울도 아님 - type_error(boolean, Undo)

Portability: GNU Prolog 술어.

더 알아보기