Cuando corresponde al patrón (con match goal with) en una táctica definida por el usuario, podemos usar ?x para enlazar un término de Gallina, de modo que más tarde podemos referirnos a él. Podemos usar varios identificadores de este tipo en una cláusula (... ?x ... ?y ...) o incluso podemos usar el mismo identificador ({... ?x ... ?x ...) para indicar que para que la cláusula coincida, debe aparecer el mismo término Gallina en aquellos Dos posiciones. En cierto modo, esto restricte las posibles coincidencias con un requisito de "igualdad". Eso es útil, pero sería más importante (SIC) para poder plantear un requisito "diferente". ¿Hay alguna manera de escribir una cláusula de coincidencia del formulario ... ?x ... ?y ... donde requerimos que los términos unidos por ?x y ?y se distinguen?

Por distinguible, no necesariamente, no quiero decir, no igual, pero solo es diferente (sus nombres [o representaciones] no coinciden). Por ejemplo, digamos que tengo dos términos a,b:C. Los dos términos podrían ser iguales en el sentido de que podemos probar la proposición a = b, pero eso es irrelevante para mis propósitos. Lo que hace que a y b se distinguen entre sí es que sus nombres son diferentes.

Entonces, ¿puedo patrón?

Para poner esto en algún contexto, digamos que tenemos parejas definidas, proyecciones y permita que R sea una relación binaria (apropiadamente escrita). Supongamos que de alguna manera termino con los siguientes dos en mis suposiciones.

H  : R (proj1 (pair a b)) c
H' : R (proj1 (pair a b)) a

Me gustaría poder escribir una cláusula de coincidencia en mi táctica que solo coincidirá H y no H'. ¿Hay un truco para eso?

Si no hay forma de coincidir solo H, entonces quizás podría coincidir ambos, donde me enlace ?x y ?x y c (o nuevamente a) a ?y. Pero luego, en el lado derecho de la cláusula de partido, me gustaría realizar algunos " son, ellos, diferentes? ", compruebe entre x y y y y y do idtac en caso de que los dos sencen literalmente los mismos términos.

2
frabala 27 jun. 2019 a las 16:09

1 respuesta

La mejor respuesta

Hay varias tácticas para verificar si dos términos son igual.

Creo que puedes combinarlo con tryif o assert_fails para hacer lo que quieres.

match goal with
  | [H : ... |- _] => tryif (constr_eq x y) then fail else some_tactic
end.
4
Bubbler 28 jun. 2019 a las 00:36