Giter Site home page Giter Site logo

ediu3095 / resolucion-calculo-proposicional Goto Github PK

View Code? Open in Web Editor NEW
1.0 1.0 0.0 313 KB

Programa de terminal diseñado para resolver problemas de lógica proposicional. Concretamente, construcción de tableros semanticos y resolución de expresiones de lógica proposicional.

ANTLR 0.99% Java 98.72% C++ 0.29%

resolucion-calculo-proposicional's Introduction

Resolución en el Cálculo Proposicional

Este repositorio contiene el código de un programa de terminal diseñado para resolver problemas de lógica proposicional. Concretamente, construcción de tableros semanticos y resolución de expresiones de lógica proposicional.

Motivación

Los problemas que intenta resolver este programa son problemas planteados en el Tema 1 de la asignatura Conocimiento y Razonamiento Automatizado del tercer curso del Grado en Ingeniería Informática de la Universidad de Alcalá. Así pues, este programa intenta facilitar el estudio de esta asignatura proporcionando una herramienta para encontrar las soluciones de los problemas de manera consistente.

Instalación

Este repositorio es un proyecto de IntelliJ IDEA. Este tiene configurado un artefacto para crear un fichero jar que pueda utilizarse para ejecutar el programa. Se puede encontrar el fichero compilado para distintas versiones del jdk en el apartado de releases del repositorio.

Compilación

Para compilarlo es necesario tener en la carpeta de dependencias el .jar con la librería ANTLR v4. La versión con la que se han creado los ficheros de la gramática es la 4.11.1 por lo que el fichero necesario sería antlr-runtime-4.11.1.jar. Sin embargo, es posible hacer que el programa funcione con otras versiones de ANTLR v4 siempre y cuando se vuelvan a generar los archivos de código a partir de la gramática en el paquete calcprop.interpreter del proyecto.

Una vez tenemos el código del programa y las dependencias correspondientes podemos compilarlo desde el menú Build > Build Artifact... > SemanticTables:jar Build. También se puede encontrar el fichero compilado para distintas versiones del jdk en el apartado de releases del repositorio.

Programas necesarios

Además del fichero compilado, para algunas opciones del programa se necesitará tener instalado y en el PATH el programa GraphViz. Este programa se utiliza para generar imagenes vectoriales de los tableros semánticos.

Uso

Para utilizar el programa desde la terminal escribiremos algo similar a lo siguiente:

java -jar RCP-XX.jar <modo> <archivo>

En el anterior comando:

  • <modo>. Puede tomar uno de los siguientes valores: tablero-semantico, resolucion.
  • <archivo>. Es la ruta del archivo que contiene la formula a procesar.

El archivo que debemos pasar como segundo argumento al programa deberá contener una expresión de lógica proposicional utilizando los siguientes operadores:

  • ¬. Operador NOT.
  • . Operador OR.
  • . Operador AND.
  • . Operador Condicional.
  • . Operador Bicondicional.
  • . Operador XOR.
  • |. Operador NAND.
  • . Operador NOR.

También se permite el uso de paréntesis para agrupar expresiones y ; para crear comentarios de línea.

El programa solamente aceptará una expresión por archivo por lo que en el siguiente fichero de ejemplo solamente se procesará la primera de las dos expresiones:

¬(((p → (r ∨ q)) ∧ (¬p → ¬s) ∧ s) → r)
¬(((p → q) → r) → (q → r))

Si pasamos el fichero test.cp como argumento obtendremos las siguientes salidas para los dos modos del programa:

Tablero semántico

java -jar RCP-XX.jar tablero-semantico test.cp

La salida del modo tablero-semantico es una imagen con el mismo nombre que el archivo de entrada, y en el mismo directorio, en formato svg. Así pues, en este caso la salida del programa sería la imagen test.cp.svg:

tablero-semantico

Como se puede observar, en el salto de cada nodo al siguiente solamente se aplica una α-regla o una β-regla. Además, las ramas abiertas del árbol terminan con el símbolo mientras que las ramas cerradas lo hacen con el símbolo ×.

Resolución

java -jar RCP-XX.jar resolucion test.cp

La salida del modo resolucion es en forma de texto a través de la salida estándar:

Formula: ¬(((p → (r ∨ q)) ∧ (¬p → ¬s) ∧ s) → r)
Forma normal conjuntiva: ((¬p ∨ r ∨ q) ∧ (p ∨ ¬s) ∧ s ∧ ¬r)
Resolucion: 
   1. (¬p ∨ q ∨ r)         
   2. (¬s ∨ p)             
   3. s                    
   4. ¬r                   
   5. (¬s ∨ q ∨ r)         ( 1,  2)
   6. (¬p ∨ q)             ( 1,  4)
   7. p                    ( 2,  3)
   8. (¬s ∨ q)             ( 2,  6)
   9. (q ∨ r)              ( 3,  5)
  10. q                    ( 3,  8)
× 11. (¬s ∨ q)             ( 4,  5) ×  8
× 11. q                    ( 4,  9) × 10
× 11. q                    ( 6,  7) × 10
× 11. (q ∨ r)              ( 1,  7) ×  9
× 11. q                    ( 3, 11) × 10
× 11. (¬s ∨ q)             ( 4,  5) ×  8
× 11. q                    ( 4,  9) × 10
× 11. q                    ( 4, 14) × 10
× 11. q                    ( 6,  7) × 10

En el modo de resolución, se transforma la expresión a forma normal conjuntiva y después se inicia la resolución con cada una de las disyunciones como un paso numerado. Los siguientes pasos indican a la derecha a partir de que otros dos pasos se han obtenido. Además, si un paso devuelve una expresión que ya se había obtenido, el paso al completo estará rodeado por el símbolo × y se indicará a la derecha el anterior paso que tiene la misma expresión.

Contribuir

En este momento, es posible que el programa tenga algunos errores de menor importancia. Esto se debe a que el programa se hizo en un corto lapso de tiempo y no tiene el código más limpio o eficiente. Puedes dejar un issue explicando cualquier error que te hayas encontrado de manera que quede documentado y así pueda arreglarlo. Si prefieres lanzarte a la aventura y arreglar tú los problemas que encuentres, te invito a crear un fork del repositorio y modificarlo como te plazca. Una vez hayas llevado a cabo los cambios que consideres si quieres que estos formen parte del repositorio siéntete libre de hacer un pull request para que los incluya.

resolucion-calculo-proposicional's People

Contributors

ediu3095 avatar

Stargazers

Pablo García avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.