private void ProcessHeadlessClause(PrologCodeTerm term)
        {
            PrologCodeHeadlessClause clause = (PrologCodeHeadlessClause)term;

            foreach (PrologCodeTerm t in clause.Goals)
            {
                if (t is PrologCodePredicate)
                {
                    PrologCodePredicate pred = (PrologCodePredicate)t;
                    switch (pred.Name)
                    {
                    case "op":
                        ProcessOperator(pred);
                        break;

                    case "class":
                        PrologCodeTerm arg = (PrologCodeTerm)pred.Arguments[0];
                        if (arg is PrologCodeConstantAtom)
                        {
                            PrologCodeConstantAtom atom = (PrologCodeConstantAtom)arg;
                            _codeUnit.Class = atom.Value;
                        }
                        else if (arg is PrologCodeStringAtom)
                        {
                            PrologCodeStringAtom atom = (PrologCodeStringAtom)arg;
                            _codeUnit.Class = atom.Value.Replace("'", "");
                        }
                        else
                        {
                            _errors.Add(new PrologCompilerError("P0002", "Illegal class name.", "", false, _scanner.Current.Line, _scanner.Current.Column));
                        }
                        break;

                    case "foreign":
                        ProcessForeignMethod(pred);
                        break;

                    case "load_assembly":
                        ProcessAssemblyDirective(pred);
                        break;

                    case "using":
                        ProcessUsingDirective(pred);
                        break;
                    }
                }
                else if (t is PrologCodeList)
                {
                }
            }
        }
        private ArrayList GetForeignMethodArguments(PrologCodePredicate f)
        {
            ArrayList args = new ArrayList();

            if (f.Arguments[0] is PrologCodeConstantAtom)
            {
                PrologCodeConstantAtom fc = (PrologCodeConstantAtom)f.Arguments[0];
                if (fc.Value == "none")
                {
                    return(args);
                }
                else
                {
                    _errors.Add(new PrologCompilerError("P0012", "Invalid predicate-method definition", "", false, _scanner.Current.Line, _scanner.Current.Column));
                    return(args);
                }
            }
            PrologCodePredicate functor = (PrologCodePredicate)f;

            foreach (PrologCodePredicate a in functor.Arguments)
            {
                int passing  = 0;
                int datatype = 0;

                switch (a.Name)
                {
                case "+":
                    passing = PrologCodeMethodArgument.PASS_IN;
                    break;

                case "-":
                    passing = PrologCodeMethodArgument.PASS_OUT;
                    break;

                case "?":
                    passing = PrologCodeMethodArgument.PASS_INOUT;
                    break;

                default:
                    break;
                }
                switch (((PrologCodeConstantAtom)a.Arguments[0]).Value)
                {
                case "string":
                    datatype = PrologCodeMethodArgument.STRING;
                    break;

                case "char":
                    datatype = PrologCodeMethodArgument.CHAR;
                    break;

                case "int":
                    datatype = PrologCodeMethodArgument.INT;
                    break;

                case "float":
                    datatype = PrologCodeMethodArgument.FLOAT;
                    break;

                case "term":
                    datatype = PrologCodeMethodArgument.TERM;
                    break;

                case "bool":
                    datatype = PrologCodeMethodArgument.BOOL;
                    break;

                default:
                    break;
                }
                args.Add(new PrologCodeMethodArgument(datatype, passing));
            }
            return(args);
        }