Beispiel #1
0
        public XsbPrologTerm Atom(string name)
        {
            var retval = new XsbPrologTerm(xsb.p2p_new());

            retval.BindAtom(name);
            return(retval);
        }
Beispiel #2
0
        public IEnumerable <XsbPrologQueryResult> Query(XsbPrologTerm query)
        {
            ulong reg1 = xsb.reg_term(1);

            xsb.p2p_unify(query.term, reg1);
            return(new XsbPrologQuery(xsb.xsb_query() == 0));
        }
Beispiel #3
0
        public bool Call(XsbPrologTerm goal)
        {
            ulong reg1 = xsb.reg_term(1);

            xsb.p2p_unify(goal.term, reg1);
            return(xsb.xsb_command() == 0);
        }
Beispiel #4
0
        public XsbPrologTerm Nil()
        {
            var term = new XsbPrologTerm(xsb.p2p_new());

            term.BindNil();
            return(term);
        }
Beispiel #5
0
        public XsbPrologTerm Float(double value)
        {
            var retval = new XsbPrologTerm(xsb.p2p_new());

            retval.BindDouble(value);
            return(retval);
        }
Beispiel #6
0
        public XsbPrologTerm Integer(int value)
        {
            var retval = new XsbPrologTerm(xsb.p2p_new());

            retval.BindInteger(value);
            return(retval);
        }
Beispiel #7
0
        public XsbPrologTerm List(XsbPrologTerm head, XsbPrologTerm tail)
        {
            var term = new XsbPrologTerm(xsb.p2p_new());

            term.BindList();
            term.Head.Unify(head);
            term.Tail.Unify(tail);
            return(term);
        }
Beispiel #8
0
 internal XsbPrologQueryResult(XsbPrologTerm query, XsbPrologTerm answer)
 {
     m_query  = query;
     m_answer = answer;
 }
Beispiel #9
0
 public bool Unify(XsbPrologTerm term)
 {
     return(xsb.p2p_unify(this.term, term.term) != 0);
 }
Beispiel #10
0
        public bool AddPredicate(string name, int arity, Delegate functor)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (arity < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(arity));
            }
            if (functor == null)
            {
                throw new ArgumentNullException(nameof(functor));
            }

            XsbNativeForeignPredicateCallback d;

            switch (arity)
            {
            case 0:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    xsb.xsb_query_save(0);
                    bool retval = ((XsbPrologCallback0)functor)();
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            case 1:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    XsbPrologTerm arg1 = new XsbPrologTerm(xsb.reg_term(1));
                    xsb.xsb_query_save(1);
                    bool retval = ((XsbPrologCallback1)functor)(arg1);
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            case 2:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    XsbPrologTerm arg1 = new XsbPrologTerm(xsb.reg_term(1));
                    XsbPrologTerm arg2 = new XsbPrologTerm(xsb.reg_term(2));
                    xsb.xsb_query_save(2);
                    bool retval = ((XsbPrologCallback2)functor)(arg1, arg2);
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            case 3:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    XsbPrologTerm arg1 = new XsbPrologTerm(xsb.reg_term(1));
                    XsbPrologTerm arg2 = new XsbPrologTerm(xsb.reg_term(2));
                    XsbPrologTerm arg3 = new XsbPrologTerm(xsb.reg_term(3));
                    xsb.xsb_query_save(3);
                    bool retval = ((XsbPrologCallback3)functor)(arg1, arg2, arg3);
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            case 4:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    XsbPrologTerm arg1 = new XsbPrologTerm(xsb.reg_term(1));
                    XsbPrologTerm arg2 = new XsbPrologTerm(xsb.reg_term(2));
                    XsbPrologTerm arg3 = new XsbPrologTerm(xsb.reg_term(3));
                    XsbPrologTerm arg4 = new XsbPrologTerm(xsb.reg_term(4));
                    xsb.xsb_query_save(4);
                    bool retval = ((XsbPrologCallback4)functor)(arg1, arg2, arg3, arg4);
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            case 5:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    XsbPrologTerm arg1 = new XsbPrologTerm(xsb.reg_term(1));
                    XsbPrologTerm arg2 = new XsbPrologTerm(xsb.reg_term(2));
                    XsbPrologTerm arg3 = new XsbPrologTerm(xsb.reg_term(3));
                    XsbPrologTerm arg4 = new XsbPrologTerm(xsb.reg_term(4));
                    XsbPrologTerm arg5 = new XsbPrologTerm(xsb.reg_term(5));
                    xsb.xsb_query_save(5);
                    bool retval = ((XsbPrologCallback5)functor)(arg1, arg2, arg3, arg4, arg5);
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            case 6:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    XsbPrologTerm arg1 = new XsbPrologTerm(xsb.reg_term(1));
                    XsbPrologTerm arg2 = new XsbPrologTerm(xsb.reg_term(2));
                    XsbPrologTerm arg3 = new XsbPrologTerm(xsb.reg_term(3));
                    XsbPrologTerm arg4 = new XsbPrologTerm(xsb.reg_term(4));
                    XsbPrologTerm arg5 = new XsbPrologTerm(xsb.reg_term(5));
                    XsbPrologTerm arg6 = new XsbPrologTerm(xsb.reg_term(6));
                    xsb.xsb_query_save(6);
                    bool retval = ((XsbPrologCallback6)functor)(arg1, arg2, arg3, arg4, arg5, arg6);
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            case 7:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    XsbPrologTerm arg1 = new XsbPrologTerm(xsb.reg_term(1));
                    XsbPrologTerm arg2 = new XsbPrologTerm(xsb.reg_term(2));
                    XsbPrologTerm arg3 = new XsbPrologTerm(xsb.reg_term(3));
                    XsbPrologTerm arg4 = new XsbPrologTerm(xsb.reg_term(4));
                    XsbPrologTerm arg5 = new XsbPrologTerm(xsb.reg_term(5));
                    XsbPrologTerm arg6 = new XsbPrologTerm(xsb.reg_term(6));
                    XsbPrologTerm arg7 = new XsbPrologTerm(xsb.reg_term(7));
                    xsb.xsb_query_save(7);
                    bool retval = ((XsbPrologCallback7)functor)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            case 8:
                d = new XsbNativeForeignPredicateCallback(() =>
                {
                    XsbPrologTerm arg1 = new XsbPrologTerm(xsb.reg_term(1));
                    XsbPrologTerm arg2 = new XsbPrologTerm(xsb.reg_term(2));
                    XsbPrologTerm arg3 = new XsbPrologTerm(xsb.reg_term(3));
                    XsbPrologTerm arg4 = new XsbPrologTerm(xsb.reg_term(4));
                    XsbPrologTerm arg5 = new XsbPrologTerm(xsb.reg_term(5));
                    XsbPrologTerm arg6 = new XsbPrologTerm(xsb.reg_term(6));
                    XsbPrologTerm arg7 = new XsbPrologTerm(xsb.reg_term(7));
                    XsbPrologTerm arg8 = new XsbPrologTerm(xsb.reg_term(8));
                    xsb.xsb_query_save(8);
                    bool retval = ((XsbPrologCallback8)functor)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
                    xsb.xsb_query_restore();
                    return(retval ? 1 : 0);
                });
                break;

            default:
                throw new NotImplementedException();
            }

            if (xsb.xsb_add_c_predicate(null, name, arity, d) == 0)
            {
                foreignPredicates.Add(d);
                return(true);
            }
            return(false);
        }