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