00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef PLANG_TERM_H
00021 #define PLANG_TERM_H
00022
00023 #include <plang/context.h>
00024 #include <stddef.h>
00025
00026 #ifdef __cplusplus
00027 extern "C" {
00028 #endif
00029
00030
00031 enum {
00032 P_TERM_INVALID,
00033 P_TERM_FUNCTOR,
00034 P_TERM_LIST,
00035 P_TERM_ATOM,
00036 P_TERM_STRING,
00037 P_TERM_INTEGER,
00038 P_TERM_REAL,
00039 P_TERM_OBJECT,
00040 P_TERM_PREDICATE,
00041 P_TERM_CLAUSE,
00042 P_TERM_DATABASE,
00043
00044 P_TERM_VARIABLE = 16,
00045 P_TERM_MEMBER_VARIABLE,
00046 };
00047
00048 enum {
00049 P_BIND_DEFAULT = 0x0000,
00050 P_BIND_NO_OCCURS_CHECK = 0x0001,
00051 P_BIND_NO_RECORD = 0x0002,
00052 P_BIND_RECORD_ONE_WAY = 0x0004,
00053 P_BIND_EQUALITY = 0x0008,
00054 P_BIND_ONE_WAY = 0x0010
00055 };
00056
00057 p_term *p_term_create_functor(p_context *context, p_term *name, int arg_count);
00058 int p_term_bind_functor_arg(p_term *term, int index, p_term *value);
00059 p_term *p_term_create_functor_with_args(p_context *context, p_term *name, p_term **args, int arg_count);
00060
00061 p_term *p_term_create_list(p_context *context, p_term *head, p_term *tail);
00062 void p_term_set_tail(p_term *list, p_term *tail);
00063 p_term *p_term_create_atom(p_context *context, const char *name);
00064 p_term *p_term_create_atom_n(p_context *context, const char *name, size_t len);
00065 p_term *p_term_create_string(p_context *context, const char *str);
00066 p_term *p_term_create_string_n(p_context *context, const char *str, size_t len);
00067 p_term *p_term_create_variable(p_context *context);
00068 p_term *p_term_create_named_variable(p_context *context, const char *name);
00069 p_term *p_term_create_member_variable(p_context *context, p_term *object, p_term *name, int auto_create);
00070 p_term *p_term_create_integer(p_context *context, int value);
00071 p_term *p_term_create_real(p_context *context, double value);
00072
00073 p_term *p_term_nil_atom(p_context *context);
00074 p_term *p_term_prototype_atom(p_context *context);
00075 p_term *p_term_class_name_atom(p_context *context);
00076
00077 p_term *p_term_deref(const p_term *term);
00078 p_term *p_term_deref_member(p_context *context, p_term *term);
00079 p_term *p_term_deref_own_member(p_context *context, p_term *term);
00080
00081 int p_term_type(const p_term *term);
00082 int p_term_arg_count(const p_term *term);
00083 const char *p_term_name(const p_term *term);
00084 size_t p_term_name_length(const p_term *term);
00085 size_t p_term_name_length_utf8(const p_term *term);
00086 p_term *p_term_functor(const p_term *term);
00087 p_term *p_term_arg(const p_term *term, int index);
00088 int p_term_integer_value(const p_term *term);
00089 double p_term_real_value(const p_term *term);
00090 p_term *p_term_head(const p_term *term);
00091 p_term *p_term_tail(const p_term *term);
00092 p_term *p_term_object(const p_term *term);
00093
00094 p_term *p_term_create_object(p_context *context, p_term *prototype);
00095 p_term *p_term_create_class_object(p_context *context, p_term *class_name, p_term *prototype);
00096 int p_term_add_property(p_context *context, p_term *term, p_term *name, p_term *value);
00097 p_term *p_term_property(p_context *context, const p_term *term, const p_term *name);
00098 p_term *p_term_own_property(p_context *context, const p_term *term, const p_term *name);
00099 int p_term_set_own_property(p_context *context, p_term *term, p_term *name, p_term *value);
00100 int p_term_is_instance_object(p_context *context, const p_term *term);
00101 int p_term_is_class_object(p_context *context, const p_term *term);
00102 int p_term_inherits(p_context *context, const p_term *term1, const p_term *term2);
00103 int p_term_is_instance_of(p_context *context, const p_term *term1, const p_term *term2);
00104
00105 p_term *p_term_create_predicate(p_context *context, p_term *name, int arg_count);
00106 p_term *p_term_create_dynamic_clause(p_context *context, p_term *head, p_term *body);
00107 void p_term_add_clause_first(p_context *context, p_term *predicate, p_term *clause);
00108 void p_term_add_clause_last(p_context *context, p_term *predicate, p_term *clause);
00109
00111 typedef struct p_term_clause_iter p_term_clause_iter;
00112 struct p_term_clause_iter
00113 {
00114 struct p_term_clause *next1;
00115 struct p_term_clause *next2;
00116 struct p_term_clause *next3;
00117 };
00119 void p_term_clauses_begin(const p_term *predicate, const p_term *head, p_term_clause_iter *iter);
00120 p_term *p_term_clauses_next(p_term_clause_iter *iter);
00121 int p_term_clauses_has_more(const p_term_clause_iter *iter);
00122
00123 p_term *p_term_create_database(p_context *context);
00124 void p_term_database_add_predicate(p_term *database, p_term *predicate);
00125 p_term *p_term_database_lookup_predicate(p_term *database, p_term *name, int arity);
00126
00127 p_term *p_term_create_member_name(p_context *context, p_term *class_name, p_term *name);
00128
00129 int p_term_bind_variable(p_context *context, p_term *var, p_term *value, int flags);
00130 int p_term_unify(p_context *context, p_term *term1, p_term *term2, int flags);
00131
00132 typedef void (*p_term_print_func)(void *data, const char *format, ...);
00133 void p_term_stdio_print_func(void *data, const char *format, ...);
00134
00135 void p_term_print(p_context *context, const p_term *term, p_term_print_func print_func, void *print_data);
00136 void p_term_print_unquoted(p_context *context, const p_term *term, p_term_print_func print_func, void *print_data);
00137 void p_term_print_with_vars(p_context *context, const p_term *term, p_term_print_func print_func, void *print_data, const p_term *vars);
00138
00139 int p_term_precedes(p_context *context, const p_term *term1, const p_term *term2);
00140
00141 int p_term_is_ground(const p_term *term);
00142 p_term *p_term_clone(p_context *context, p_term *term);
00143 p_term *p_term_unify_clause(p_context *context, p_term *term, p_term *clause);
00144
00145 int p_term_strcmp(const p_term *str1, const p_term *str2);
00146 p_term *p_term_concat_string(p_context *context, p_term *str1, p_term *str2);
00147
00148 p_term *p_term_witness(p_context *context, p_term *term, p_term **subgoal);
00149
00150 p_term *p_term_expand_dcg(p_context *context, p_term *term);
00151
00152 enum {
00153 P_SORT_ASCENDING = 0x0000,
00154 P_SORT_DESCENDING = 0x0001,
00155 P_SORT_KEYED = 0x0002,
00156 P_SORT_REVERSE_KEYED = 0x0004,
00157 P_SORT_UNIQUE = 0x0008
00158 };
00159
00160 p_term *p_term_sort(p_context *context, p_term *list, int flags);
00161
00162 #ifdef __cplusplus
00163 };
00164 #endif
00165
00166 #endif