コード例 #1
0
ファイル: ComplexSentence.cs プロジェクト: gonzsa04/IA
 //
 // PRIVATE
 //
 private void AssertLegalArguments(Connective connective, params Sentence[] sentences)       // Sentence...
 {
     if (connective == null)
     {
         throw new ArgumentNullException("Connective must be specified.");             // IllegalArgumentException
     }
     if (sentences == null)
     {
         throw new ArgumentNullException("> 0 simpler sentences must be specified.");             // IllegalArgumentException
     }
     if (connective == Connective.NOT)
     {
         if (sentences.Length != 1)                                                                                             //en vez de Count (puede que sea incluso un array vacío... no nulo, pero vacío, ojo)
         {
             throw new ArgumentException("A not (~) complex sentence take exactly 1 simpler sentence not " + sentences.Length); // IllegalArgumentException
         }
     }
     else
     {
         if (sentences.Length != 2)
         {
             throw new ArgumentException("Connective is binary (" + connective + ") but only " + sentences.Length + " simpler sentences provided");                 // IllegalArgumentException
         }
     }
 }
コード例 #2
0
ファイル: PLParser.cs プロジェクト: gonzsa04/IA
        private ParseNode ParseConnective()
        {
            Token      token      = LookAhead(1);
            Connective connective = Connective.Get(token.GetText());

            Consume();
            return(new ParseNode(connective, token));
        }
コード例 #3
0
ファイル: ComplexSentence.cs プロジェクト: gonzsa04/IA
        /**
         * Constructor.
         *
         * @param connective
         *            la conectiva de la sentencia compuesta
         * @param sentences
         *            las sentencias más simples que forma la sentencia compuesta.
         */
        public ComplexSentence(Connective connective, params Sentence[] sentences)       // Sentence...
        // Aserciones para comprobar los argumentos
        {
            AssertLegalArguments(connective, sentences);

            this.connective  = connective;
            simplerSentences = new Sentence[sentences.Length];
            Array.Copy(sentences, 0, simplerSentences, 0, sentences.Length);         // System.arraycopy en Java, creo que los parámetros son equivalentes todos
        }
コード例 #4
0
ファイル: Sentence.cs プロジェクト: gonzsa04/IA
        /**
         * Rutina de utilidad que creará una representación en forma de cadena de una sentencia dada y la colocará entre paréntesis si es una sentencia compleja de menor precedencia que esta sentencia compleja.
         * Nota: Esta es una forma de imprimir más bonita, donde sólo añadimos paréntesis en la representación de la sintaxis concreta si se necesitan
         * para asegurarnos que se puede parsear de vuelta en la representación de sintaxix abstracta equivalente que usamos aquí.
         *
         * @param parentConnective
         *            la conectiva de la sentencia padre.
         * @param childSentence
         *            una sentencia hija más simple.
         * @return una representación en forma de cadena de la sentencia, entre paréntesis si el padre tiene mayor precedencia basándonos en su conectiva.
         */
        public string BracketSentenceIfNecessary(Connective parentConnective, Sentence childSentence)
        {
            string result = null;

            if (childSentence is ComplexSentence)
            {
                ComplexSentence cs = (ComplexSentence)childSentence;
                if (cs.GetConnective().Precedence < parentConnective.Precedence)
                {
                    result = "(" + childSentence + ")";
                }
            }

            if (result == null)
            {
                result = childSentence.ToString();
            }

            return(result);
        }
コード例 #5
0
ファイル: PLParser.cs プロジェクト: gonzsa04/IA
        // Faltan por poner muchos comentarios aquí...

        private IList <ParseNode> GroupSimplerSentencesByConnective(
            Connective connectiveToConstruct, IList <ParseNode> parseNodes)
        {
            IList <ParseNode> newParseNodes = new List <ParseNode>();   // En vez de ArrayList, una List normal
            int numSentencesMade            = 0;

            // Ir desde la derecha a la izquierda en orden para hacer asociatividad a la derecha, que es lo más natural para tener por defecto en lógica proposicional.
            for (int i = parseNodes.Count - 1; i >= 0; i--)
            {
                ParseNode parseNode = parseNodes[i];
                if (parseNode.node is Connective)
                {
                    Connective tokenConnective = (Connective)parseNode.node;
                    if (tokenConnective == Connective.NOT)
                    {
                        // A unary connective
                        if (i + 1 < parseNodes.Count && parseNodes[i + 1].node is Sentence)
                        {
                            if (tokenConnective == connectiveToConstruct)
                            {
                                ComplexSentence newSentence = new ComplexSentence(
                                    connectiveToConstruct,
                                    (Sentence)parseNodes[i + 1].node);
                                parseNodes[i]     = new ParseNode(newSentence, parseNode.token);
                                parseNodes[i + 1] = null;
                                numSentencesMade++;
                            }
                        }
                        else
                        {
                            throw new ParserException(
                                      "Unary connective argurment is not a sentence at input position "
                                      + parseNode.token.GetStartCharPositionInInput(),
                                      parseNode.token);
                        }
                    }
                    else
                    {
                        // A Binary connective
                        if ((i - 1 >= 0 && parseNodes[i - 1].node is Sentence) &&
                            (i + 1 < parseNodes.Count && parseNodes[i + 1].node is Sentence))
                        {
                            // A binary connective
                            if (tokenConnective == connectiveToConstruct)
                            {
                                ComplexSentence newSentence = new ComplexSentence(
                                    connectiveToConstruct,
                                    (Sentence)parseNodes[i - 1].node,
                                    (Sentence)parseNodes[i + 1].node);
                                parseNodes[i - 1] = new ParseNode(newSentence, parseNode.token);
                                parseNodes[i]     = null;
                                parseNodes[i + 1] = null;
                                numSentencesMade++;
                            }
                        }
                        else
                        {
                            throw new ParserException(
                                      "Binary connective argurments are not sentences at input position "
                                      + parseNode.token
                                      .GetStartCharPositionInInput(),
                                      parseNode.token);
                        }
                    }
                }
            }

            for (int i = 0; i < parseNodes.Count; i++)
            {
                ParseNode parseNode = parseNodes[i];
                if (parseNode != null)
                {
                    newParseNodes.Add(parseNode);
                }
            }

            // Se asegura de que no quedan tokens sin contar en esta pasada.
            int toSubtract = 0;

            if (connectiveToConstruct == Connective.NOT)
            {
                toSubtract = (numSentencesMade * 2) - numSentencesMade;
            }
            else
            {
                toSubtract = (numSentencesMade * 3) - numSentencesMade;
            }

            if (parseNodes.Count - toSubtract != newParseNodes.Count)
            {
                throw new ParserException(
                          "Unable to construct sentence for connective: "
                          + connectiveToConstruct + " from: " + parseNodes,
                          GetTokens(parseNodes));
            }

            return(newParseNodes);
        }
コード例 #6
0
ファイル: Sentence.cs プロジェクト: gonzsa04/IA
 //
 // PROTECTED
 //
 protected bool HasConnective(Connective connective)
 {
     // Nota: se puede usar '==' ya que Connective es un enumerado.
     return(GetConnective() == connective);
 }
コード例 #7
0
ファイル: ComplexSentence.cs プロジェクト: gonzsa04/IA
 /**
  * Constructor conveniente para sentencias binarias.
  *
  * @param sentenceL
  *          la sentencia de la izquierda.
  * @param binaryConnective
  *          la conectiva binaria.
  * @param sentenceR
  *          la sentencia de la derecha.
  */
 public ComplexSentence(Sentence sentenceL, Connective binaryConnective, Sentence sentenceR) : this(binaryConnective, sentenceL, sentenceR)
 {
 }