Thanks for the quick and thorough response.

How might I extend this example so it is impossible to prove `0 != 0`? I 
don't know of anything other than distinct variables that would prevent 
something like this.
On Thursday, December 29, 2022 at 7:21:12 PM UTC-5 [email protected] wrote:

> A variation on your example which should be rejected would be to use `x` 
> twice, like so:
>
> $c true num != $.
>
> $v x y $.
>
> num_x $f num x $.
> num_y $f num y $.
>
> ${
>     $d x y $.
>     x_ne_y $a true x != y $.
> $}
>
> the1 $p true x != x $=
>     num_x num_x x_ne_y $.
>
> On Thu, Dec 29, 2022 at 7:15 PM Mario Carneiro <[email protected]> wrote:
>
>> The metamath C implementation is correct in this case, that is a correct 
>> theorem. A $d constraint on two variables asserts that the substitutions to 
>> those variables have no *variables* in common. A constant expression like 
>> "0" has no variables in it, so it is disjoint with itself.
>>
>> The use of != here is misleading, because a $d on two variables is not 
>> asserting that the variables have distinct values, but rather distinct 
>> *names*. So for example we need something like that to know that y is free 
>> in "A. x x e. y", because if x and y had the same name then the theorem 
>> would be asserting "A. x x e. x" which has no free variables in it.
>>
>> One consequence of this is that for sorts which have binding syntax in 
>> them, like the "setvar x" used in "A.  x ph",  it is disastrous to allow 
>> constants in, in the sense of $a setvar 0 $., because then you could form 
>> the expression "A. 0 x = 0" which in addition to being nonsensical can be 
>> used to prove false by circumventing the $d check on a theorem that 
>> requires it - e.g. dtru says "-. A. x x = y" but if you substitute 0 for 
>> both x and y you get "-. A. 0 0 = 0", and you can similarly substitute 0 
>> for x in a proof of "A. x x = x" to get "A. 0 0 = 0" and hence a 
>> contradiction.
>>
>> On Thursday, December 29, 2022 at 7:03:37 PM UTC-5 [email protected] 
>> wrote:
>>
>>> I'm working on a verifier for Metamath proofs, and I've reached the 
>>> point of implementing disjoint requirements. I tried to make a minimal 
>>> example of invalid use of disjoint variables, but the primary C metamath 
>>> implementation seems to accept it. I'm likely doing something wrong, but I 
>>> can't figure out what.
>>>
>>> AFAIU, this file should not verify, but it does:
>>>
>>> ```
>>> $c true num 0 1 != $.
>>> $v x y $.
>>>
>>> num_x $f num x $.
>>> num_y $f num y $.
>>>
>>> num_0 $a num 0 $.
>>> num_1 $a num 1 $.
>>>
>>> num_zero $a num 0 $.
>>> num_one  $a num 1 $.
>>>
>>> ${
>>>     $d x y $.
>>>     x_ne_y $a true x != y $.
>>> $}
>>>
>>> the1 $p true 0 != 0 $=
>>>     num_zero num_zero x_ne_y $.
>>> ```
>>>
>> -- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "Metamath" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/metamath/Ww0shheWk_U/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> [email protected].
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/metamath/80cb855b-cc66-4d67-9060-98913da6bd56n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/metamath/80cb855b-cc66-4d67-9060-98913da6bd56n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Metamath" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/metamath/75cc3e29-1ff0-4769-8b6a-4ed2a332e3e9n%40googlegroups.com.

Reply via email to