def un.adc_not

bend-osdev-u32@0.1.0.0 · PROOF.bend:584

import bend-osdev-u32@0.1.0.0/PROOF.bend as PROOF
import Base

584def un.adc_not(n: Nat, a: Word(n), b: Word(n), c: Bool) -> {Word.adc(n, a, b, True{}, c) == Word.adc(n, a, Word.not(n, b), False{}, c) : Word(n)}:
585  match n:
586    case 0n:
587      match a b:
588        case WNil{} WNil{}:
589          {==}
590    case 1n+ +p:
591      match a b c:
592        case WCon{False{}, +at} WCon{False{}, +bt} False{}:
593          un.wcon_cong(p, True{}, Word.adc(p, at, bt, True{}, False{}), Word.adc(p, at, Word.not(p, bt), False{}, False{}), un.adc_not(p, at, bt, False{}))
594        case WCon{False{}, +at} WCon{False{}, +bt} True{}:
595          un.wcon_cong(p, False{}, Word.adc(p, at, bt, True{}, True{}), Word.adc(p, at, Word.not(p, bt), False{}, True{}), un.adc_not(p, at, bt, True{}))
596        case WCon{False{}, +at} WCon{True{}, +bt} False{}:
597          un.wcon_cong(p, False{}, Word.adc(p, at, bt, True{}, False{}), Word.adc(p, at, Word.not(p, bt), False{}, False{}), un.adc_not(p, at, bt, False{}))
598        case WCon{False{}, +at} WCon{True{}, +bt} True{}:
599          un.wcon_cong(p, True{}, Word.adc(p, at, bt, True{}, False{}), Word.adc(p, at, Word.not(p, bt), False{}, False{}), un.adc_not(p, at, bt, False{}))
600        case WCon{True{}, +at} WCon{False{}, +bt} False{}:
601          un.wcon_cong(p, False{}, Word.adc(p, at, bt, True{}, True{}), Word.adc(p, at, Word.not(p, bt), False{}, True{}), un.adc_not(p, at, bt, True{}))
602        case WCon{True{}, +at} WCon{False{}, +bt} True{}:
603          un.wcon_cong(p, True{}, Word.adc(p, at, bt, True{}, True{}), Word.adc(p, at, Word.not(p, bt), False{}, True{}), un.adc_not(p, at, bt, True{}))
604        case WCon{True{}, +at} WCon{True{}, +bt} False{}:
605          un.wcon_cong(p, True{}, Word.adc(p, at, bt, True{}, False{}), Word.adc(p, at, Word.not(p, bt), False{}, False{}), un.adc_not(p, at, bt, False{}))
606        case WCon{True{}, +at} WCon{True{}, +bt} True{}:
607          un.wcon_cong(p, False{}, Word.adc(p, at, bt, True{}, True{}), Word.adc(p, at, Word.not(p, bt), False{}, True{}), un.adc_not(p, at, bt, True{}))

Uses (8)

Used by (1)