Crear programa de logica

Iniciado por $Edu$, 10 Septiembre 2011, 03:33 AM

0 Miembros y 1 Visitante están viendo este tema.

ShotgunLogic

Te comento que tienes que trabajar con lógica Proposicional. Vamos, básicamente lo que estas haciendo, unas proposiciones que son las variables, y las conectivas que son los enlaces(&&, |, etc...).

El problema que tienen estos programas es que el algoritmo de resolución básico que harías(que son las tablas de verdad) tiene esta forma:

2^n

Donde n es el número de proposiciones(ya que pueden ser verdaderas o falsas).

Es un verdadero problema, ya que una vez que tengas un gran número de proposiciones se va a disparar el número de ejecuciones que vas a realizar. Para eso se han creado una serie de métodos(como sacarlo por contradicción) que hacen que el algoritmo tenga una complejidad menor. De hecho, asi fue como surgio uno de los primeros problemas np complejos, que todavia sigue sin resolver.

Pero bueno, el caso es que hay una pagina en la que se compite por ver quien es capaz de idear el algoritmo mas eficiente:

http://www.satcompetition.org

Se trata de saber si una fórmula es satisfacible, lo que usaras para ver si un razonamiento es correcto(el razonamiento deberia de ser siempre satisfacible).

http://es.wikipedia.org/wiki/Problema_de_satisfacibilidad_booleana#Algoritmos

En el apartado de algoritmos tienes un resumen, yo que tu me lo leeria, ya que el tema de logica es muy importante en el desarrollo de la computacion y la algoritmia en general, ademas de ser realmente fascinante.

Cualquier duda pregunta, que probablemente me pase poniendo conceptos XD

Un saludo!



The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.

$Edu$

eso de 2 a la n, lo hice ya, es decir mire que si tenia hasta la variable S serian 16 el tamaño de mis arrays para lo de VVVVVVVVFFFFFFFF para la preposicion S, pero claro si ponian otra variable mas ya mi codigo no funciona, pero es que mi idea era para hacer ejercicios que nos mandaba el profesor de filosofia, que son de los simples:

Si Juan estudia mucho entonces salvara el examen.
Juan estudio mucho por lo tanto salvara el examen.

[(p>q).(q)]>q

Creo que seria asi, como ves son cosas simples pero veo que para hacerlo bien de bien necesitare estudiar mucho asique lo dejo para cuando aprenda en la universidad mejor.

Aunque yo queria lograr hacerlo con lo poco que se hasta ahora, es decir tomando un string que ingresara el usuario en el programa como por ejemplo:

[(p>q).(q)]>q

Y mi programa haria (p>q) y lo guardaria en un array a su valor que sera un array de strings [ "V", "V", etc, etc]
Luego haria (q) y lo guardaria en otro array.
Despues haria lo mismo con q, para despues hacer el primer array con el segundo por medio del "." y ese resultado con el resultado del q por medio del >


Mis avances son:

- El programa capta el tamaño de esos strings, ya que puede aparecer otra preposicion y se hara mas largo el tamaño.
- Tengo un metodo que si le envias (p>q), te lee esas preposiciones para saber cuales son y cual es el simbolo ( el operador  ">" en este caso) y luego envia esos datos a otro metodo que devuelve el string[] resultado.

El problema que tengo es como ir guardando esos arrays de resultados, ya que pueden ser muchos, a veces pocos, etc. Pense en una lista de arrays ya que lo estoy haciendo en C# en .net y se me hace facil eso. Pero si una vez que los guarde en una lista, como se cuales son los que se tienen que operar otra vez y cual es el que queda al final?
La logica me llevo a que los 2 primeros en el ejemplo que puse, son los que se tienen que operar otra vez y luego el resultado de esos con el 3ero que es solamente "q".
Pero que pasa? cuando no es asi? cuando esta mas desordenado? con "[" por ejemplo aca me caga todo:

[(p>q)].[(q>r).p] -- para dar un ejemplo nomas.

Ya que ahi seria al revez, se operarian otra vez los 2 ultimos xD.
Y otra cosa, como leo el simbolo que hara que se operen otra vez esos 2, en este ultimo caso el "." ?


Si alguien leyo todo esto y lo entendio, se merece un premio jajaja

$Edu$


тαптяα

Y que parentesis, coges como prioridad? te habran enseñado los conectivos logicos supongo..y sabras su jerarquia.

Y sabiendo su jerarquia, debes saber que no hace falta que hayan parentesis en algunas proposiciones logicas. Asi que en lo que debes centrarte, es en analizar la proposicion, buscando los conectivos, dando prioridad para hacer la tabla de la verdad    a la conjunción y ddisyunción, luego a la condicional y por ultimo a la bicondicional.

Y apartir de ahi, vas sacando tablas y tablas hasta que llegas a hacer todo.

Yo la idea la tengo clara, loo que no tengo es el tiempo

Saludos

$Edu$

Mmm pero el usuario lo que ingresara sera la ecuacion , ya pensada por el, el programa solo hara las operaciones, fijate en mi penultimo mensaje a ver en que me podrias dar una mano