Ejemplo n.º 1
0
    private object ConceptBinding(string name)
    {
        var camelCase = ConvertCamelCase(name);
        var concept   = Ontology.Part(camelCase) ?? Ontology[camelCase];

        if (concept == null)
        {
            return(null);
        }

        switch (concept)
        {
        case CommonNoun n:
            DefineSurrogate(concept,
                            Predicate <PossibleIndividual>(name, i => i.IsA(n)));
            break;

        case Adjective a:
            DefineSurrogate(concept,
                            Predicate <PossibleIndividual>(name, i => i.IsA(a)));
            break;

        case Verb verb:
            DefineSurrogate(concept,
                            Predicate <PossibleIndividual, PossibleIndividual>(name, (i1, i2) => i1.RelatesTo(i2, verb)));
            break;

        case Property p:
            if (p.Type is CatSAT.NonBoolean.SMT.Float.FloatDomain)
            {
                DefineSurrogate(concept,
                                UnaryFunction <PossibleIndividual, float>(name, i => (float)i.PropertyValue(p)));
            }
            else
            {
                DefineSurrogate(concept,
                                DeterministicText <PossibleIndividual>(name, i => new[] { i.PropertyValue(p).ToString() }));
            }
            break;

        case Part p:
            DefineSurrogate(concept,
                            GeneralRelation <PossibleIndividual, PossibleIndividual>(name,
                                                                                     (c, part) => part.Individual.ContainerPart == p && part.Individual.Container == c.Individual,
                                                                                     c =>
            {
                if (c.Individual.Parts.TryGetValue(p, out var partFillers))
                {
                    return(partFillers.Select(f => c.Invention.PossibleIndividual(f)));
                }
                throw new ArgumentException($"{c.NameString()} does not contain the part {p}");
            },
                                                                                     part => (part.Individual.ContainerPart == p) ? new[] { part.Invention.PossibleIndividual(part.Individual.Container) } : new PossibleIndividual[0],
                                                                                     null));
            break;
        }

        return(concept);
    }