jotha escribió:No si eso ya lo he probado, el problema es q tras hacer eso el goal es: 2*0=x \/1+2*0=x
y no se como resolverlo, ya q creo q no se puede decidir, si fuesen valores concretos si, pero asi no, o eso creo repito.
Ya te contesté por email
jotha escribió:No si eso ya lo he probado, el problema es q tras hacer eso el goal es: 2*0=x \/1+2*0=x
y no se como resolverlo, ya q creo q no se puede decidir, si fuesen valores concretos si, pero asi no, o eso creo repito.
x: nat
y: nat
H: 2 * S y = S(S x))
------------------------------
2 * y = x
InaDmO escribió:hum... yo lo que hago es aplicar antes de nada (antes de hacer intro, que creo q tenia problemas) el Esquema y luego a base de unfolds, lefts/roights y reflexivitis pues por lo menos los dos primeros subgoals se resuleven
susana escribió:Sí, efectivamente ese era el problema.
Si haces intro ya no te "coincide" el lema que tienes que resolver con el final del tipo de Esquema, así que hay problemas si se hace apply Esquema.
La solución es hacer apply Esquema al principio de todo o utilizar elim x using Esquema en caso de hacer intros. Con esta última táctica se dice que se aplique el principio de inducción sobre x, pero en vez de aplicar el usual (nat_ind, ya que x:nat) se indica que se use Esquema en su lugar.
InaDmO escribió:el div_ent_2 y el esquema me los he saltado y estoy ahora con los aux, con un problema igual al que tenia jhota ¿como salgo de aqui:?x: nat
y: nat
H: 2 * S y = S(S x))
------------------------------
2 * y = x
trasteando solo llego a absurdos como 2*y=0, 2*y=1....
susana escribió:InaDmO escribió:el div_ent_2 y el esquema me los he saltado y estoy ahora con los aux, con un problema igual al que tenia jhota ¿como salgo de aqui:?x: nat
y: nat
H: 2 * S y = S(S x))
------------------------------
2 * y = x
trasteando solo llego a absurdos como 2*y=0, 2*y=1....
Básicamente lo que tienes es que es cierto que (S(S (2*y))) = S ( S x) (H escrito de otra forma). Y necesitas demostrar 2 * y = x. Parece bastante obvio no? Es decir, la idea es poder demostrar que si S ( n ) = S ( m ) -> n = m, (dos veces seguidas, ya que lo que tenemos en la hipótesis es el siguiente del siguiente).
Lo que quiero decir es que intentéis analizar qué es lo que tenéis como cierto y qué es lo que tenéis que demostrar. Podéis hacer lemas auxiliares sencillitos que os ayuden a hacer la demostración, incluso puede que ya esté hecha y exista un lema que os lo resuelva... (podéis ver la documentación en internet).
ishinay escribió:susana escribió:Sí, efectivamente ese era el problema.
Si haces intro ya no te "coincide" el lema que tienes que resolver con el final del tipo de Esquema, así que hay problemas si se hace apply Esquema.
La solución es hacer apply Esquema al principio de todo o utilizar elim x using Esquema en caso de hacer intros. Con esta última táctica se dice que se aplique el principio de inducción sobre x, pero en vez de aplicar el usual (nat_ind, ya que x:nat) se indica que se use Esquema en su lugar.
Concretamente, ¿cómo es eso de aplicar el principio de inducción? ¿Qué hipótesis tienes y de qué manera se transforman? (por así decirlo) y ¿por qué? es que yo con "induction" no me entero de nada, ni por qué aparecen unas hipótesis dadas ni por qué desaparecen otras cosas ni por qué otras veces es como si fuera un simple "elim".
Goal(forall n:nat, n>=0)nat_ind
: forall P : nat -> Prop,
P 0 -> (forall n : nat, P n -> P (S n)) -> forall n : nat, P nEsquema: forall P : nat -> Prop,
P 0 ->
P 1 -> (forall n : nat, P n -> P (S (S n))) -> forall n : nat, P nsusana escribió:InaDmO escribió:el div_ent_2 y el esquema me los he saltado y estoy ahora con los aux, con un problema igual al que tenia jhota ¿como salgo de aqui:?x: nat
y: nat
H: 2 * S y = S(S x))
------------------------------
2 * y = x
trasteando solo llego a absurdos como 2*y=0, 2*y=1....
Básicamente lo que tienes es que es cierto que (S(S (2*y))) = S ( S x) (H escrito de otra forma). Y necesitas demostrar 2 * y = x. Parece bastante obvio no? Es decir, la idea es poder demostrar que si S ( n ) = S ( m ) -> n = m, (dos veces seguidas, ya que lo que tenemos en la hipótesis es el siguiente del siguiente).
Lo que quiero decir es que intentéis analizar qué es lo que tenéis como cierto y qué es lo que tenéis que demostrar. Podéis hacer lemas auxiliares sencillitos que os ayuden a hacer la demostración, incluso puede que ya esté hecha y exista un lema que os lo resuelva... (podéis ver la documentación en internet).
InaDmO escribió:Hasta esa suposicion habia llegado, pero no se como transformar mi objetivo para que sea como la hipotesis, pq si hago replaces luego tengo que demostrar cosas como S(S x) = x, lo cual no es cierto. Me estoy volviendo loco..
susana escribió:Básicamente lo que tienes es que es cierto que (S(S (2*y))) = S ( S x) (H escrito de otra forma). Y necesitas demostrar 2 * y = x. Parece bastante obvio no? Es decir, la idea es poder demostrar que si S ( n ) = S ( m ) -> n = m, (dos veces seguidas, ya que lo que tenemos en la hipótesis es el siguiente del siguiente).
x: nat
y: nat
H: 2 * S y = S(S x))
------------------------------
2 * y = xjotha escribió:
- Código: Seleccionar todo
Lemma aux11 : forall y:nat, 2*S y = S(S(2*y)). ### SIGNIFICA: 2*(y+1) = (2*y)+2
Lemma aux12: forall n m:nat, S ( n ) = S ( m ) -> n = m. ### SIGNIFICA: Si (n+1)=(m+1) entonces n=m.
InaDmO escribió:Por cierto, para resolver el Esquema es muy muy facil si sabeis que hipotesis añadir. Una vez hecho parece de niños pequeños.
jotha escribió:He conseguido demostrar el lema aux1, y para hacerlo he necesitado las dos cosillas q dice susana, y lo he implementado con dos lemas mas.
Lemma aux11 : forall y:nat, 2*S y = S(S(2*y)).
Lemma aux12: forall n m:nat, S ( n ) = S ( m ) -> n = m.
Las demostraciones son muy faciles, y con ellos en 3 lineas esta listo el aux1.
ishinay escribió:¿Cómo hace Coq para generar los principos de inducción apartir de una difinición inductiva? (y no me refiero al ejemplo de nat, sino al cualquier cosa).
Inductive DiaSemana : Set :=
Lunes : DiaSemana
| Martes : DiaSemana
| Miercoles : DiaSemana
| Jueves : DiaSemana
| Viernes : DiaSemana
DiaSemana_ind
: forall P : DiaSemana -> Prop,
P Lunes ->
P Martes ->
P Miercoles -> P Jueves -> P Viernes -> forall d : DiaSemana, P dInductive nat : Set := O : nat | S : nat -> nat
nat_ind
: forall P : nat -> Prop,
P 0 -> (forall n : nat, P n -> P (S n)) -> forall n : nat, P nInductive or (A : Prop) (B : Prop) : Prop :=
or_introl : A -> A \/ B | or_intror : B -> A \/ B
or_ind
: forall A B P : Prop, (A -> P) -> (B -> P) -> A \/ B -> PInductive and (A : Prop) (B : Prop) : Prop := conj : A -> B -> A /\ B
and_ind
: forall A B P : Prop, (A -> B -> P) -> A /\ B -> PInductive False : Prop :=
False_ind
: forall P : Prop, False -> PVolver a FIC Asignaturas 2008-09
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados