summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/builtins.c b/builtins.c
index 35db61a..5751502 100644
--- a/builtins.c
+++ b/builtins.c
@@ -409,6 +409,23 @@ builtinuniv(Term *goal, Binding **bindings, Module *module)
Term *term = goal->children;
Term *list = term->next;
+ if(term->tag == VariableTerm && ispartiallist(list))
+ Throw(instantiationerror());
+ if(!(ispartiallist(list) || islist(list)))
+ Throw(typeerror(L"list", list));
+
+ Term *head = listhead(list);
+ Term *tail = listtail(list);
+
+ if(term->tag == VariableTerm && head->tag == VariableTerm)
+ Throw(instantiationerror());
+ if(islist(list) && !(head->tag == AtomTerm || head->tag == VariableTerm) && !isemptylist(tail))
+ Throw(typeerror(L"atom", head));
+ if(islist(list) && head->tag == CompoundTerm && isemptylist(tail))
+ Throw(typeerror(L"atomic", head));
+ if(term->tag == VariableTerm && isemptylist(list))
+ Throw(domainerror(L"non_empty_list", list));
+
int len;
if(term->tag == VariableTerm){
Rune *name;