summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/builtins.c b/builtins.c
index b2c7da6..8215930 100644
--- a/builtins.c
+++ b/builtins.c
@@ -317,30 +317,49 @@ builtinfunctor(Term *goal, Binding **bindings, Module *module)
Term *name = term->next;
Term *arity = name->next;
- if(term->tag == CompoundTerm){
- Term *realname = mkatom(term->text);
- Term *realarity = mkinteger(term->arity);
- if(unify(name, realname, bindings) && unify(arity, realarity, bindings))
- return 1;
- }else if(arity->tag == IntegerTerm &&
- (name->tag == AtomTerm || name->tag == IntegerTerm || name->tag == FloatTerm)){
+ if(term->tag == VariableTerm && name->tag == VariableTerm)
+ Throw(instantiationerror());
+ if(term->tag == VariableTerm && arity->tag == VariableTerm)
+ Throw(instantiationerror());
+ if(term->tag == VariableTerm && !(name->tag == VariableTerm || name->tag == AtomTerm || name->tag == IntegerTerm || name->tag == FloatTerm))
+ Throw(typeerror(L"atomic", name));
+ if(term->tag == VariableTerm && !(arity->tag == VariableTerm || arity->tag == IntegerTerm))
+ Throw(typeerror(L"integer", arity));
+ if(term->tag == VariableTerm && name->tag != VariableTerm && name->tag != AtomTerm && arity->tag == IntegerTerm && arity->ival > 0)
+ Throw(typeerror(L"atom", name));
+ if(term->tag == VariableTerm && arity->tag == IntegerTerm && arity->ival < 0)
+ Throw(domainerror(L"not_less_than_zero", arity));
+
+
+ if(term->tag == VariableTerm){
if(arity->ival == 0)
return unify(term, name, bindings);
else{
- if(name->tag != AtomTerm)
- return 0;
-
- /* Make arity maky fresh variables */
+ /* Make arity many fresh variables */
int i;
Term *args = nil;
for(i = 0; i < arity->ival; i++){
- Rune *varname = runesmprint("FunctorVar%d", i);
- Term *arg = mkvariable(varname);
+ Term *arg = mkvariable(L"_");
args = appendterm(args, arg);
}
Term *realterm = mkcompound(name->text, arity->ival, args);
return unify(term, realterm, bindings);
}
+ }else{
+ Rune *namestr;
+ int arityint;
+
+ if(term->tag == CompoundTerm){
+ namestr = term->text;
+ arityint = term->arity;
+ }else{
+ namestr = prettyprint(term, 0, 0, 0);
+ arityint = 0;
+ }
+ Term *realname = mkatom(namestr);
+ Term *realarity = mkinteger(arityint);
+ if(unify(name, realname, bindings) && unify(arity, realarity, bindings))
+ return 1;
}
return 0;
}