static private PredicateProperty AddDefs(Rule rule)
            {
                PredicateProperty headPP = GetPredicateProperty(rule.head);;

                if (rule.body != null)
                {
                    foreach (var p in rule.body.plist.ArgList)
                    {
                        if (!(p is Term))
                        {
                            continue;
                        }
                        GetPredicateProperty((Term)p);
                    }
                }
                return(headPP);
            }
            public static RDFArgSpec GetAdef(PredicateProperty def, int argNum1Based, bool okToMake)
            {
                RDFArgSpec adef;

                lock (def.argDefs)
                {
                    if (!def.argDefs.TryGetValue(argNum1Based, out adef))
                    {
                        if (!okToMake)
                        {
                            return(null);
                        }
                        adef = def.argDefs[argNum1Based] = new RDFArgSpec(argNum1Based);
                        adef.AddDomainType(def, argNum1Based + 1);
                    }
                }
                return(adef);
            }
        public static void DocumentTerm(Term term, bool varnamesOnly)
        {
            bool newlyCreated;
            PredicateProperty pp = GraphWithDef.GetPredDef(term.fname, term.Arity, out newlyCreated);
            int argNum           = 0;

            foreach (Part part in term.ArgList)
            {
                argNum++;
                if (varnamesOnly)
                {
                    if (!(part is Variable))
                    {
                        continue;
                    }
                }
                var argDef = GraphWithDef.GetAdef(pp, argNum, true);
                argDef.AddRangeTypeName(part.Text);
            }
        }
            public static PredicateProperty GetPredDef(string predName, int arity, out bool newlyCreated)
            {
                PredicateProperty def;
                string            key = Unsymbolize(predName);// +"_" + arity;

                lock (SharedGlobalPredDefs)
                {
                    if (!SharedGlobalPredDefs.TryGetValue(key, out def))
                    {
                        newlyCreated = true;
                        string predClassName = "PredClass_" + key;
                        SharedGlobalPredDefs[key] =
                            def =
                                new PredicateProperty(arity)
                        {
                            name = predName, keyname = key, classname = predClassName
                        };
                        return(def);
                    }
                }
                newlyCreated = false;
                return(def);
            }