Prolog 항 조작
Prolog 항 조작
C 코드에서 Prolog 항을 조작하는 함수들을 설명해요.
본문
소개
다음에서 Prolog 항을 조작하는 함수 집합을 제시해요. 단순 foreign 항의 경우 함수는 단순 C 유형을 조작해요(10.3.2절).
리스트를 관리하는 함수는 리스트의 머리와 꼬리에 대응하는 항을 포함하는 2개 요소(유형 PlTerm)의 배열을 처리해요. 빈 리스트의 경우 NULL이 배열로 전달돼요. 이 함수들은 각 하위 리스트에서 리스트를 평면화해야 해요. 정규 리스트(즉 []로 끝나는 리스트)의 관리를 단순화하기 위해 리스트의 요소 수(정수)와 요소들이(유형 PlTerm)인 배열을 처리하는 함수 집합이 제공돼요. 이 함수들의 호출자는 배열을 제공해야 해요.
복합 항을 관리하는 함수는 functor(항의 주 functor), 항수 N ≥ 0, 그리고 복합 항의 하위 항들을 포함하는 N개 요소(유형 PlTerm)의 배열을 처리해요. 리스트는 복합 항의 특수 경우(functor = '.'이고 항수 = 2)이므로 리스트를 다루기 위해 복합 항을 관리하는 어떤 함수든 사용할 수 있지만 오류 감지는 같지 않아요. 실제로 많은 함수가 Prolog 인자가 올바른지 확인해요. Prolog 인자를 확인하는 읽기 또는 통일 함수의 이름은 Name_Check() 형태예요. 이 함수 각각에 확인 없는 버전 Name()도 있어요. 여기서는 확인 함수의 이름만 제시해요.
Prolog 원자 관리
각 원자는 GNU Prolog 원자 테이블에서의 인덱스에 대응하는 고유한 내부 키(정수)를 가져요. 원자에 대한 정보를 얻고 새 원자를 만드는 데 다음을 사용할 수 있어요:
char *Pl_Atom_Name (int atom)
int Pl_Atom_Length (int atom)
PlBool Pl_Atom_Needs_Quote (int atom)
PlBool Pl_Atom_Needs_Scan (int atom)
PlBool Pl_Is_Valid_Atom (int atom)
int Pl_Create_Atom (const char *str)
int Pl_Create_Allocate_Atom(const char *str)
int Pl_Find_Atom (const char *str)
int Pl_Atom_Char (char c)
int Pl_Atom_Nil (void)
int Pl_Atom_False (void)
int Pl_Atom_True (void)
int Pl_Atom_End_Of_File (void)
Pl_Atom_Name(atom)— atom의 내부 문자열을 반환(이 문자열은 수정해서는 안 됨).Pl_Atom_Length(atom)— atom의 (이름의) 길이를 반환.Pl_Atom_Needs_Scan(atom)— atom의 정규 형태가writeq/2(8.14.6절)처럼 인용되어야 하는지 나타냄. 그 경우Pl_Atom_Needs_Scan(atom)은 단순히 atom 이름 주위에 따옴표를 쓰는 것으로 충분한지, 아니면 인쇄 불가능한 문자(또는 포함된 따옴표 문자)가 있으므로 이름의 각 문자를 스캔해야 하는지 나타냄.Pl_Is_Valid_Atom(atom)— atom이 기존 원자의 내부 키일 때만 참.Pl_Create_Atom(str)— 이름이 str의 내용인 새 원자를 시스템에 추가하고 그 내부 키를 반환. 원자가 이미 존재하면 그 키가 단순히 반환. 함수에 전달된 문자열 str은 나중에 수정해서는 안 됨.Pl_Create_Allocate_Atom(str)— 이 조건을 보장할 수 없을 때 제공. 간단히 str의 동적 복사본을 만듦(strdup(3)사용).Pl_Find_Atom(str)— 이름이 str인 원자의 내부 키를 반환하거나, 존재하지 않으면 -1.
단일 문자에 대응하는 모든 원자는 이미 존재하고 그 키는 Pl_Atom_Char 함수로 얻을 수 있어요. 예: Pl_Atom_Char('.')는 '.'와 연관된 원자(이 원자는 리스트의 functor). 다른 함수들은 자주 사용되는 원자인 [], false, true, end_of_file의 내부 키를 반환해요.
Prolog 항 읽기
여기에 제시된 모든 함수의 이름은 Pl_Rd_Name_Check() 형태예요. 이들은 모두 읽을 Prolog 항의 유효성을 확인하고 필요하면 적절한 오류를 발생시켜요. 각 함수에는 Pl_Rd_Name()이라 불리는 확인 없는 버전이 있어요.
단순 foreign 유형: 각 단순 foreign 유형(10.3.2절)에 대해 읽기 함수가 있어요(인터페이스가 입력 인자를 제공할 때 사용):
PlLong Pl_Rd_Integer_Check (PlTerm term)
PlLong Pl_Rd_Positive_Check (PlTerm term)
int Pl_Rd_C_Int_Check (PlTerm term)
int Pl_Rd_C_Int_Positive_Check(PlTerm term)
double Pl_Rd_Float_Check (PlTerm term)
double Pl_Rd_Number_Check (PlTerm term)
int Pl_Rd_Atom_Check (PlTerm term)
int Pl_Rd_Boolean_Check (PlTerm term)
int Pl_Rd_Char_Check (PlTerm term)
int Pl_Rd_In_Char_Check (PlTerm term)
int Pl_Rd_Code_Check (PlTerm term)
int Pl_Rd_In_Code_Check (PlTerm term)
int Pl_Rd_Byte_Check (PlTerm term)
int Pl_Rd_In_Byte_Check (PlTerm term)
char *Pl_Rd_String_Check (PlTerm term)
char *Pl_Rd_Chars_Check (PlTerm term)
char *Pl_Rd_Codes_Check (PlTerm term)
int Pl_Rd_Chars_Str_Check (PlTerm term, char *str)
int Pl_Rd_Codes_Str_Check (PlTerm term, char *str)
Pl_Rd_C_Int_Check()는 Pl_Rd_Integer_Check()와 비슷하지만 PlLong 대신 C int를 반환해요. Prolog 정수가 C int에 맞지 않으면 representation_error가 발생해요(이것은 int가 32비트인 64비트 기계에서 발생할 수 있음). Pl_Rd_C_Int_Positive_Check()도 비슷해요. C 문자열(char *)을 반환하는 모든 함수는 같은 버퍼를 사용해요. Pl_Rd_Chars_Str_Check()는 Pl_Rd_Chars_Check()와 비슷하지만 결과를 저장할 문자열을 인자로 받고 그 문자열의 길이(또한 Prolog 리스트의 길이)를 반환해요. Pl_Rd_Codes_Str_Check()도 비슷해요.
복합 항: 다음 함수들은 복합 항의 하위 인자(항)를 PlTerm의 배열로 반환하며, Pl_Rd_Proper_List_Check()만 읽은 리스트의 크기를 반환(그리고 배열 요소를 초기화)해요. 복합 함수 인자에 대한 더 자세한 내용은 이 절의 도입을 참조해요(10.4.1절).
int Pl_Rd_Proper_List_Check(PlTerm term, PlTerm *arg)
PlTerm *Pl_Rd_List_Check (PlTerm term)
PlTerm *Pl_Rd_Compound_Check (PlTerm term, int *functor, int *arity)
PlTerm *Pl_Rd_Callable_Check (PlTerm term, int *functor, int *arity)
Prolog 항 통일
여기에 제시된 모든 함수의 이름은 Pl_Un_Name_Check() 형태예요. 이들은 모두 통일할 Prolog 항의 유효성을 확인하고 필요하면 적절한 오류를 발생시켜요. 각 함수에는 Pl_Un_Name()이라 불리는 확인 없는 버전이 있어요.
단순 foreign 유형: 각 단순 foreign 유형(10.3.2절)에 대해 통일 함수가 있어요(인터페이스가 출력 인자를 제공할 때 사용):
PlBool Pl_Un_Integer_Check (PlLong n, PlTerm term)
PlBool Pl_Un_Positive_Check(PlLong n, PlTerm term)
PlBool Pl_Un_Float_Check (double n, PlTerm term)
PlBool Pl_Un_Number_Check (double n, PlTerm term)
PlBool Pl_Un_Atom_Check (int atom, PlTerm term)
PlBool Pl_Un_Boolean_Check (int b, PlTerm term)
PlBool Pl_Un_Char_Check (int c, PlTerm term)
PlBool Pl_Un_In_Char_Check (int c, PlTerm term)
PlBool Pl_Un_Code_Check (int c, PlTerm term)
PlBool Pl_Un_In_Code_Check (int c, PlTerm term)
PlBool Pl_Un_Byte_Check (int b, PlTerm term)
PlBool Pl_Un_In_Byte_Check (int b, PlTerm term)
PlBool Pl_Un_String_Check (const char *str, PlTerm term)
PlBool Pl_Un_Chars_Check (const char *str, PlTerm term)
PlBool Pl_Un_Codes_Check (const char *str, PlTerm term)
Pl_Un_Number_Check(n, term)은 n이 정수이면 term을 정수로, 그 외에는 부동소수점 수로 통일해요. Pl_Un_String_Check(str, term)은 str에 대응하는 원자를 만들고 term을 그와 통일해요(Pl_Un_Atom_Check(Pl_Create_Allocate_Atom(str), term)과 동일).
다음 함수들은 일반 통일(두 항 사이)을 수행해요. 두 번째 것은 occurs-check 테스트를 수행해요(첫 번째 것은 하지 않음):
PlBool Pl_Unif(PlTerm term1, PlTerm term2)
PlBool Pl_Unif_With_Occurs_Check(PlTerm term1, PlTerm term2)
복합 항: 다음 함수들은 복합 항의 하위 인자(항)를 PlTerm의 배열로 받아들여요. 복합 함수 인자에 대한 더 자세한 내용은 이 절의 도입을 참조해요(10.4.1절).
PlBool Pl_Un_Proper_List_Check(int size, PlTerm *arg, PlTerm term)
PlBool Pl_Un_List_Check (PlTerm *arg, PlTerm term)
PlBool Pl_Un_Compound_Check (int functor, int arity, PlTerm *arg, PlTerm term)
PlBool Pl_Un_Callable_Check (int functor, int arity, PlTerm *arg, PlTerm term)
이 모든 함수는 통일할 항의 유형을 확인하고 통일의 결과를 반환해요. 일반적으로 통일이 실패하면 C 함수는 실패를 강제하기 위해 PL_FALSE를 반환해요. 그러나 통일할 인자가 여러 개이고 한 통일이 실패하면 C 함수는 PL_FALSE를 반환하고 다른 인자의 유형은 확인되지 않아요. 보통 모든 오류 사례는 어떤 작업을 하기 전에 테스트되어 술어가 오류 조건이 충족되지 않을 때만 성공/실패함을 보장해요. 그래서 좋은 방법은 통일할 모든 인자의 유효성을 확인하고 나중에(확인 없는 함수를 사용해) 통일하는 것이에요. 당연히 통일할 것이 하나뿐이면 인자를 확인하는 통일 함수를 사용하는 것이 더 효율적이에요.
다른 경우를 위해 인터페이스는 항의 유형을 확인하는 함수 집합을 제공해요.
단순 foreign 유형: 각 단순 foreign 유형(10.3.2절)에 대해 통일 확인 함수가 있어요(인터페이스가 출력 인자를 제공할 때 사용):
void Pl_Check_For_Un_Integer (PlTerm term)
void Pl_Check_For_Un_Positive(PlTerm term)
void Pl_Check_For_Un_Float (PlTerm term)
void Pl_Check_For_Un_Number (PlTerm term)
void Pl_Check_For_Un_Atom (PlTerm term)
void Pl_Check_For_Un_Boolean (PlTerm term)
void Pl_Check_For_Un_Char (PlTerm term)
void Pl_Check_For_Un_In_Char (PlTerm term)
void Pl_Check_For_Un_Code (PlTerm term)
void Pl_Check_For_Un_In_Code (PlTerm term)
void Pl_Check_For_Un_Byte (PlTerm term)
void Pl_Check_For_Un_In_Byte (PlTerm term)
void Pl_Check_For_Un_String (PlTerm term)
void Pl_Check_For_Un_Chars (PlTerm term)
void Pl_Check_For_Un_Codes (PlTerm term)
복합 항: 다음 함수들은 복합 항의 유효성을 확인해요:
void Pl_Check_For_Un_List (PlTerm term)
void Pl_Check_For_Un_Compound(PlTerm term)
void Pl_Check_For_Un_Callable(PlTerm term)
void Pl_Check_For_Un_Variable(PlTerm term)
Pl_Check_For_Un_List(term)은 term이 리스트와 통일될 수 있는지 확인해요. 이 테스트는 전체 리스트에 대해 수행돼요(term의 functor/항수뿐만 아니라 리스트의 꼬리에도 재귀적으로). Pl_Check_For_Un_Variable(term)은 term이 현재 인스턴스화되지 않았음을 보장해요. 이 함수들은 Prolog 항의 유형을 테스트하는 함수(10.4.6절)와 Prolog 오류를 발생시키는 함수(10.5절)를 사용해 정의될 수 있어요. 예를 들어 Pl_Check_For_Un_List(term)은 다음과 같이 정의돼요:
void Pl_Check_For_Un_List(PlTerm term)
{
if (!Pl_Builtin_List_Or_Partial_List(term))
Pl_Err_Type(type_list, term);
}
Prolog 항 생성
이 함수들은 Prolog 항을 생성하기 위해 제공돼요. 각 함수는 생성된 항을 포함하는 PlTerm을 반환해요.
단순 foreign 유형: 각 단순 foreign 유형(10.3.2절)에 대해 생성 함수가 있어요:
PlTerm Pl_Mk_Integer (PlLong n)
PlTerm Pl_Mk_Positive(PlLong n)
PlTerm Pl_Mk_Float (double n)
PlTerm Pl_Mk_Number (double n)
PlTerm Pl_Mk_Atom (int atom)
PlTerm Pl_Mk_Boolean (int b)
PlTerm Pl_Mk_Char (int c)
PlTerm Pl_Mk_In_Char (int c)
PlTerm Pl_Mk_Code (int c)
PlTerm Pl_Mk_In_Code (int c)
PlTerm Pl_Mk_Byte (int b)
PlTerm Pl_Mk_In_Byte (int b)
PlTerm Pl_Mk_String (const char *str)
PlTerm Pl_Mk_Chars (const char *str)
PlTerm Pl_Mk_Codes (const char *str)
Pl_Mk_Number(n)은 n이 정수이면 정수로, 그 외에는 부동소수점 수로 term을 초기화해요. Pl_Mk_String(str)은 먼저 str에 대응하는 원자를 만들고 그 Prolog 원자를 반환해요(즉 Pl_Mk_Atom(Pl_Create_Allocate_Atom(str))과 동일).
복합 항: 다음 함수들은 복합 항의 하위 인자(항)를 PlTerm의 배열로 받아들여요. 복합 함수 인자에 대한 더 자세한 내용은 이 절의 도입을 참조해요(10.4.1절).
PlTerm Pl_Mk_Proper_List(int size, const PlTerm *arg)
PlTerm Pl_Mk_List (PlTerm *arg)
PlTerm Pl_Mk_Compound (int functor, int arity, const PlTerm *arg)
PlTerm Pl_Mk_Callable (int functor, int arity, const PlTerm *arg)
Prolog 항의 유형 테스트
다음 함수들은 Prolog 항의 유형을 테스트해요. 각 함수는 유형 테스트 내장 술어(8.1.1절)에 대응해요.
PlBool Pl_Builtin_Var (PlTerm term)
PlBool Pl_Builtin_Non_Var (PlTerm term)
PlBool Pl_Builtin_Atom (PlTerm term)
PlBool Pl_Builtin_Integer (PlTerm term)
PlBool Pl_Builtin_Float (PlTerm term)
PlBool Pl_Builtin_Number (PlTerm term)
PlBool Pl_Builtin_Atomic (PlTerm term)
PlBool Pl_Builtin_Compound (PlTerm term)
PlBool Pl_Builtin_Callable (PlTerm term)
PlBool Pl_Builtin_List (PlTerm term)
PlBool Pl_Builtin_Partial_List (PlTerm term)
PlBool Pl_Builtin_List_Or_Partial_List(PlTerm term)
PlBool Pl_Builtin_Fd_Var (PlTerm term)
PlBool Pl_Builtin_Non_Fd_Var (PlTerm term)
PlBool Pl_Builtin_Generic_Var (PlTerm term)
PlBool Pl_Builtin_Non_Generic_Var (PlTerm term)
int Pl_Type_Of_Term (PlTerm term)
PlLong Pl_List_Length (PlTerm list)
Pl_Type_Of_Term(term)은 term의 유형을 반환하며, 이 유형을 테스트하려면(예: switch 명령에서) 다음 상수를 사용할 수 있어요:
PL_PLV— Prolog 변수.PL_FDV— 유한 도메인 변수.PL_INT— 정수.PL_FLT— 부동소수점 수.PL_ATM— 원자.PL_LST— 리스트.PL_STC— 구조체.
태그 PL_LST는 주 functor가 '.'이고 항수가 2인 항을 의미해요(빈 리스트는 원자 []라는 점을 기억). 태그 PL_STC는 그 외의 복합 항을 의미해요. Pl_List_Length(list)는 리스트의 요소 수를(빈 리스트는 0) 반환해요. list가 리스트가 아니면 이 함수는 -1을 반환해요.
Prolog 항 비교
다음 함수들은 Prolog 항을 비교해요. 각 함수는 비교 내장 술어(8.3.2절)에 대응해요.
PlBool Pl_Builtin_Term_Eq (PlTerm term1, PlTerm term2)
PlBool Pl_Builtin_Term_Neq(PlTerm term1, PlTerm term2)
PlBool Pl_Builtin_Term_Lt (PlTerm term1, PlTerm term2)
PlBool Pl_Builtin_Term_Lte(PlTerm term1, PlTerm term2)
PlBool Pl_Builtin_Term_Gt (PlTerm term1, PlTerm term2)
PlBool Pl_Builtin_Term_Gte(PlTerm term1, PlTerm term2)
이 모든 함수는 term1이 term2보다 작으면 음의 정수, 같으면 0, 그 외에는 양의 정수를 반환하는 일반 비교 함수를 기반으로 해요:
PlLong Term_Compare(PlTerm term1, PlTerm term2)
마지막으로 다음 함수는 term1과 term2의 비교 결과에 따라 cmp를 원자 <, = 또는 >와 통일하는 compare/3 내장(8.3.3절)에 대한 접근을 제공해요:
PlBool Pl_Builtin_Compare(PlTerm cmp, PlTerm term1, PlTerm term2)
항 처리
다음 함수들은 내장 술어 functor/3(8.4.1절), arg/3(8.4.2절) 및 (=..)/2(8.4.3절)에 대한 접근을 제공해요.
PlBool Pl_Builtin_Functor(PlTerm term, PlTerm functor, PlTerm arity)
PlBool Pl_Builtin_Arg(PlTerm arg_no, PlTerm term, PlTerm sub_term)
PlBool Pl_Builtin_Univ(PlTerm term, PlTerm list)
다음 함수들은 Prolog 항의 복사본을 만들어요:
void Pl_Copy_Term (PlTerm *dst_term, const PlTerm *src_term)
void Pl_Copy_Contiguous_Term(PlTerm *dst_term, const PlTerm *src_term)
int Pl_Term_Size (PlTerm term)
Pl_Copy_Term(dst_term, src_term)은 src_term에 있는 항의 복사본을 만들어 dst_term이 주는 주소에서 저장해요. 결과는 연속 항(contiguous term)이에요. 소스 항이 연속 항임을(즉 이전 복사의 결과) 보장할 수 있으면 Pl_Copy_Contiguous_Term()을 대신 사용할 수 있어요(더 빠름). 어쨌든 복사에 충분한 공간이(dst_term부터) 있어야 해요. Pl_Term_Size(term)은 term이 필요로 하는 PlTerm의 수를 반환해요.
다음 함수는 내장 술어 write/1(8.14.6절)과 비슷하게 항을 콘솔에 표시하는 유틸리티예요.
void Pl_Write(PlTerm term)
이 Pl_Write 함수는 디버깅 목적으로 사용될 수 있어요. 그러나 write/1의 내용을 C 문자열로 받는 것이 더 유연해요. 이는 다음 함수들로 이룰 수 있어요(각각 write/1, writeq/1, write_canonical/1, display/1(8.14.6절)을 사용해 항의 텍스트 표현을 얻음). 이 함수들은 malloc(3)을 사용해 동적으로 할당된 C 문자열을 반환하며, 더 이상 필요하지 않으면 사용자가 해제할 수 있어요.
char *Pl_Write_To_String(PlTerm term)
char *Pl_Writeq_To_String(PlTerm term)
char *Pl_Write_Canonical_To_String(PlTerm term)
char *Pl_Display_To_String(PlTerm term)
마지막으로 다음 함수는 반대 변환을 수행해요: C 문자열이 주어지면 연관된 Prolog 항을 반환해요. read_term/2(8.14.1절)를 end_of_term(eof) 옵션과 함께 사용해요(따라서 C 문자열은 점으로 끝날 필요가 없음).
PlTerm Pl_Read_From_String(const char *str)
산술 표현식 비교 및 평가
다음 함수들은 산술 표현식을 비교해요. 각 함수는 비교 내장 술어(8.6.3절)에 대응해요.
PlBool Pl_Builtin_Eq (PlTerm expr1, PlTerm expr2)
PlBool Pl_Builtin_Neq(PlTerm expr1, PlTerm expr2)
PlBool Pl_Builtin_Lt (PlTerm expr1, PlTerm expr2)
PlBool Pl_Builtin_Lte(PlTerm expr1, PlTerm expr2)
PlBool Pl_Builtin_Gt (PlTerm expr1, PlTerm expr2)
PlBool Pl_Builtin_Gte(PlTerm expr1, PlTerm expr2)
다음 함수는 표현식 expr을 평가하고 그 결과를 Prolog 숫자(정수 또는 부동소수점 수)로 result에 저장해요:
void Pl_Math_Evaluate(PlTerm expr, PlTerm *result)
이 함수 뒤에 읽기 함수(10.4.3절)가 와서 결과를 얻을 수 있어요.