Prolog 지시자

Prolog 지시자

Prolog 지시자는 컴파일러를 위해 Prolog 소스 파일에 삽입하는 주석(annotation)이에요.

출처: GNU Prolog Manual - Prolog directives

본문

소개

Prolog 지시자는 Prolog 소스 파일에 삽입하는 컴파일러용 주석이에요. Prolog 지시자는 다음을 지정하는 데 사용돼요:

  • 소스 파일에 정의된 일부 프로시저의 속성.
  • (변경 가능한 Prolog 플래그를 사용한) 소스 파일에서 읽을 항의 형식과 구문.
  • 포함된(include) 소스 파일.
  • 실행 시점에 실행할 목표.

dynamic/1

Templates

dynamic(+predicate_indicator)
dynamic(+predicate_indicator_list)
dynamic(+predicate_indicator_sequence)

Description dynamic(Pred)는 술어 표시자가 Pred인 프로시저가 동적(dynamic) 프로시저임을 지정해요. 이 지시자는 절을 추가하거나 제거함으로써 Pred의 정의를 변경할 수 있게 해줘요. 자세한 내용은 동적 절 관리에 관한 절(8.7.1절)을 참고해요.

이 지시자는 소스 파일에서 Pred의 정의보다 앞서야 해요. 소스 파일에 Pred에 대한 절이 없더라도 Pred는 빈 술어로 존재해요(즉 current_predicate(Pred)가 성공한다는 뜻).

여러 정의를 허용하기 위해 Pred는 술어 표시자들의 리스트이거나 ','/2를 구분자로 사용한 술어 표시자들의 시퀀스일 수도 있어요.

Portability: ISO 지시자.

public/1

Templates

public(+predicate_indicator)
public(+predicate_indicator_list)
public(+predicate_indicator_sequence)

Description public(Pred)는 술어 표시자가 Pred인 프로시저가 공개(public) 프로시저임을 지정해요. 이 지시자는 Pred의 절을 검사할 수 있게 해줘요. 자세한 내용은 동적 절 관리에 관한 절(8.7.1절)을 참고해요.

이 지시자는 소스 파일에서 Pred의 정의보다 앞서야 해요. 동적 프로시저는 또한 공개이므로, 이미 dynamic으로 선언된 술어에 public 지시자를 정의하는 것은 쓸모없지만(그래도 맞음).

여러 정의를 허용하기 위해 Pred는 술어 표시자들의 리스트이거나 ','/2를 구분자로 사용한 시퀀스일 수도 있어요.

Portability: GNU Prolog 지시자. ISO 참조 표준은 술어를 공개로 선언하는 지시자를 정의하지 않지만 공개 술어를 구분하긴 해요. 대부분의 Prolog 시스템에서 public/1 지시자는 가시성 선언으로 쓰인다는 점을 주목할 만해요. 실제로 술어를 공개로 선언하면 어떤 다른 파일에서 정의된 술어에서도 볼 수 있게 돼요(그렇지 않으면 그 술어는 자신과 같은 소스 파일에서 정의된 술어에서만 볼 수 있어요). GNU Prolog에 모듈 시스템이 통합될 때 ISO 참조를 따르는 더 일반적인 가시성 선언이 제공될 거예요.

multifile/1

Templates

multifile(+predicate_indicator)
multifile(+predicate_indicator_list)
multifile(+predicate_indicator_sequence)

Description multifile(Pred)는 술어 표시자가 Pred인 프로시저가 멀티파일(multifile) 프로시저임을 지정해요(Pred의 절이 여러 소스 파일에 있을 수 있음). 이 지시자는 GNU Prolog 버전 1.4.0부터만 지원돼요.

GNU Prolog의 네이티브 컴파일 방식은 멀티파일 술어 Pred를 참조하는 각 Prolog 소스 파일이 이 파일에 Pred에 대한 절이 정의되어 있지 않더라도(즉 Pred가 이 소스 파일의 다른 술어에 의해 호출만 되는 경우) multifile(Pred) 지시자를 포함해야 요구해요.

Portability: ISO 지시자.

discontiguous/1

Templates

discontiguous(+predicate_indicator)
discontiguous(+predicate_indicator_list)
discontiguous(+predicate_indicator_sequence)

Description discontiguous(Pred)는 술어 표시자가 Pred인 프로시저가 비연속(discontiguous) 프로시저임을 지정해요. 즉 Pred를 정의하는 절들이 연속적일 필요 없이 소스 파일의 어디에나 나타날 수 있어요.

이 지시자는 소스 파일에서 Pred의 정의보다 앞서야 해요.

여러 정의를 허용하기 위해 Pred는 리스트이거나 ','/2를 구분자로 사용한 시퀀스일 수도 있어요.

multifile 술어(multifile/1 지시자로 선언된 것)는 multifile로 선언되지 않은 파일에서 직접 호출될 수 없어요(네이티브 컴파일러는 호출된 술어가 multifile임을 알아야 함). 해결 방법: 메타 호출(예: call/1 사용)로 호출하거나, 호출하는 소스 파일에서 multifile로 선언하세요. 좋은 습관은 multifile 술어를 그것을 호출하는 단일파일(monofile) 술어로 캡슐화하는 거예요(외부 호출은 단일파일 래퍼 술어만 호출).

Portability: ISO 지시자.

ensure_linked/1

Templates

ensure_linked(+predicate_indicator)
ensure_linked(+predicate_indicator_list)
ensure_linked(+predicate_indicator_sequence)

Description ensure_linked(Pred)는 술어 표시자가 Pred인 프로시저가 링커에 의해 포함되어야 함을 지정해요. 이 지시자는 네이티브 코드로 컴파일할 때 링커가 주어진 술어의 코드를 포함하도록 강제하는 데 유용해요. 실제로 실행 파일의 크기를 줄이기 위한 옵션(4.4.3절)으로 gplc가 호출되면 링커는 정적으로 참조되는 술어의 코드만 포함해요. 그러나 링커는 동적으로 참조되는 술어(메타 호출 술어에 데이터로 전달되는 것)를 감지할 수 없어요. 이 지시자를 사용하면 그런 술어의 코드가 제외되는 것을 막아요.

여러 정의를 허용하기 위해 Pred는 리스트이거나 ','/2를 구분자로 사용한 시퀀스일 수도 있어요.

Portability: GNU Prolog 지시자.

built_in/0, built_in/1, built_in_fd/0, built_in_fd/1

Templates

built_in
built_in(+predicate_indicator)
built_in(+predicate_indicator_list)
built_in(+predicate_indicator_sequence)
built_in_fd
built_in_fd(+predicate_indicator)
built_in_fd(+predicate_indicator_list)
built_in_fd(+predicate_indicator_sequence)

Description built_in은 지금부터 정의되는 프로시저가 built_in 속성(8.8.2절)을 갖도록 지정해요. built_in(Pred)built_in/0과 비슷하지만 술어 표시자가 Pred인 프로시저에만 영향을 줘요. 이 지시자는 소스 파일에서 Pred의 정의보다 앞서야 해요.

여러 정의를 허용하기 위해 Pred는 리스트이거나 ','/2를 구분자로 사용한 시퀀스일 수도 있어요.

built_in_fd(resp. built_in_fd(Pred))는 built_in(resp. built_in(Pred))과 비슷하지만 built_in_fd 술어 속성(8.8.2절)을 설정해요.

Portability: GNU Prolog 지시자.

include/1

Templates

include(+atom)

Description include(File)는 Prolog 소스 File의 내용이 삽입되어야 함을 지정해요. 결과 Prolog 텍스트는 지시자를 Prolog 소스 File의 내용으로 대체하여 얻은 Prolog 텍스트와 동일해요.

File이 상대 파일 이름인 경우 현재 디렉터리에서 검색돼요. 찾지 못하면 부모 includer의 각 디렉터리에서 검색돼요. File의 구문에 대한 정보는 absolute_file_name/2(8.26.1절)를 참고해요.

Portability: ISO 지시자.

if/1, else/0, endif/0, elif/1

Templates

if(+callable_term)
else
endif
elif(+callable_term)

Description 이 지시자들은 조건부 컴파일을 위한 것이에요.

  • if(Goal) - Goal이 성공하는 경우에만 이후 코드를 컴파일. Goal은 먼저 expand_term/2(8.17.2절)로 처리돼요. Goal이 예외를 제기하면 출력되고 Goal은 실패해요.
  • else - else 부분을 도입.
  • endif - 조건부 컴파일 부분을 종료.
  • elif(Goal) - :- else. :- if(Goal). ... :- endif의 약식.

Portability: GNU Prolog 지시자. SWI와 YAP에도 있음.

ensure_loaded/1

Templates

ensure_loaded(+atom)

Description ensure_loaded(File)은 GNU Prolog에서 지원되지 않아요. 이런 지시자를 만나면 단순히 무시돼요.

Portability: ISO 지시자. 지원되지 않음.

op/3

Templates

op(+integer, +operator_specifier, +atom_or_atom_list)

Description op(Priority, OpSpecifier, Operator)는 연산자 테이블을 변경해요. 이 지시자는 내장 술어 op/3(8.14.10절)을 호출해 만나자마자 실행돼요. 실행 시점에 이 지시자의 효과를 반영하기 위해 시스템 지시자도 생성돼요(4.4.4절).

Portability: ISO 지시자.

char_conversion/2

Templates

char_conversion(+character, +character)

Description char_conversion(InChar, OutChar)는 문자 변환 매핑을 변경해요. 이 지시자는 내장 술어 char_conversion/2(8.14.12절)를 호출해 만나자마자 실행돼요. 실행 시점에 이 지시자의 효과를 반영하기 위해 시스템 지시자도 생성돼요(4.4.4절).

Portability: ISO 지시자.

set_prolog_flag/2

Templates

set_prolog_flag(+flag, +term)

Description set_prolog_flag(Flag, Value)는 Prolog 플래그 Flag의 값을 Value로 설정해요. 이 지시자는 내장 술어 set_prolog_flag/2(8.22.1절)를 호출해 만나자마자 실행돼요. 실행 시점에 이 지시자의 효과를 반영하기 위해 시스템 지시자도 생성돼요(4.4.4절).

Portability: ISO 지시자.

initialization/1

Templates

initialization(+callable_term)

Description initialization(Goal)은 실행 시점에 실행되어야 할 목표 집합에 Goal을 추가해요. 실행 시점에 Goal을 실행하기 위해 사용자 지시자가 생성돼요. 같은 파일에 여러 initialization 지시자가 있으면 나타난 순서대로 실행돼요(4.4.4절).

Portability: ISO 지시자.

foreign/2, foreign/1

Templates

foreign(+callable_term, +foreign_option_list)
foreign(+callable_term)

Description foreign(Template, Options)는 프로토타입이 Template인 인터페이스 술어를 Options가 주는 옵션에 따라 정의해요. 자세한 내용은 foreign 코드 인터페이스 참조(10.3절). foreign(Template)foreign(Template, [])과 동일해요.

Portability: GNU Prolog 지시자.

더 알아보기