diff options
Diffstat (limited to 'types.c')
-rw-r--r-- | types.c | 58 |
1 files changed, 58 insertions, 0 deletions
@@ -0,0 +1,58 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> + +#include "dat.h" +#include "fns.h" + +/* Type tests */ +int +islist(Term *t) +{ + return (isemptylist(t) || isnonemptylist(t)); +} + +int +ispartiallist(Term *t) +{ + if(t->tag == VariableTerm) + return 1; + else if(t->tag == CompoundTerm && runestrcmp(t->text, L".") == 0 && t->arity == 2) + return ispartiallist(listtail(t)); + else + return 0; +} + +int +isemptylist(Term *t) +{ + return (t->tag == AtomTerm && runestrcmp(t->text, L"[]") == 0); +} + +int +isnonemptylist(Term *t) +{ + if(t->tag == CompoundTerm && runestrcmp(t->text, L".") == 0 && t->arity == 2) + return islist(listtail(t)); + else + return 0; +} + +/* Other functions */ +Term * +listhead(Term *t) +{ + if(t->tag == CompoundTerm && runestrcmp(t->text, L".") == 0 && t->arity == 2) + return t->children; + else + return nil; +} + +Term * +listtail(Term *t) +{ + if(t->tag == CompoundTerm && runestrcmp(t->text, L".") == 0 && t->arity == 2) + return t->children->next; + else + return nil; +}
\ No newline at end of file |