LAWS.bend open laws/TODOs
raw source on the hub · import 0xc6ecb72f45a1b2f83318765698582f7f/LAWS.bend as LAWS
Definitional laws for Color layer 1.
Honest scope: Base F32 primitives (add/mul/div/show/cmp/clamp/...) are opaque to definitional equality. Therefore rgb_to_hsl / hsl_to_rgb roundtrips, F32.clamp-based field updates, and Color.range_valid (which uses F32.is_le on alpha) are NOT stated as {==} laws. Runtime smoke for converts lives in main.bend. Laws below are only claims that normalize under Bend 2.0.2.
2 imports
import Base import ./lib.bend as C
Laws
law rgb_ctor provedin PROOF.bendsource · line 12 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(10, 20, 30, 1.0) == 0xc6ecb72f45a1b2f83318765698582f7f/lib.Rgb{10, 20, 30, 1.0} : 0xc6ecb72f45a1b2f83318765698582f7f/lib.Rgb}Constructors equal their data literals.
law hsl_ctor provedin PROOF.bendsource · line 15 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl(120.0, 1.0, 0.5, 1.0) == 0xc6ecb72f45a1b2f83318765698582f7f/lib.Hsl{120.0, 1.0, 0.5, 1.0} : 0xc6ecb72f45a1b2f83318765698582f7f/lib.Hsl}
law range_ctor provedin PROOF.bendsource · line 18 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.range(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(0, 0, 0, 0.0), 0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(1, 2, 3, 1.0)) == 0xc6ecb72f45a1b2f83318765698582f7f/lib.ColorRange{0xc6ecb72f45a1b2f83318765698582f7f/lib.Rgb{0, 0, 0, 0.0}, 0xc6ecb72f45a1b2f83318765698582f7f/lib.Rgb{1, 2, 3, 1.0}} : 0xc6ecb72f45a1b2f83318765698582f7f/lib.ColorRange}
law rgb_r_proj provedin PROOF.bendsource · line 26 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb_r(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(10, 20, 30, 1.0)) == 10 : U32}Constructor projections.
law rgb_g_proj provedin PROOF.bendsource · line 29 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb_g(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(10, 20, 30, 1.0)) == 20 : U32}
law rgb_b_proj provedin PROOF.bendsource · line 32 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb_b(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(10, 20, 30, 1.0)) == 30 : U32}
law rgb_a_proj provedin PROOF.bendsource · line 35 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb_a(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(10, 20, 30, 0.5)) == 0.5 : F32}
law hsl_h_proj provedin PROOF.bendsource · line 38 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl_h(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl(240.0, 0.25, 0.75, 1.0)) == 240.0 : F32}
law hsl_s_proj provedin PROOF.bendsource · line 41 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl_s(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl(240.0, 0.25, 0.75, 1.0)) == 0.25 : F32}
law hsl_l_proj provedin PROOF.bendsource · line 44 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl_l(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl(240.0, 0.25, 0.75, 1.0)) == 0.75 : F32}
law hsl_a_proj provedin PROOF.bendsource · line 47 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl_a(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl(240.0, 0.25, 0.75, 0.25)) == 0.25 : F32}
law clamp_u8_low provedin PROOF.bendsource · line 51 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.clamp_u8(0) == 0 : U32}U32 clamp helpers.
law clamp_u8_mid provedin PROOF.bendsource · line 54 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.clamp_u8(128) == 128 : U32}
law clamp_u8_high provedin PROOF.bendsource · line 57 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.clamp_u8(255) == 255 : U32}
law clamp_u8_overflow provedin PROOF.bendsource · line 60 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.clamp_u8(300) == 255 : U32}
law clamp_u8_way_over provedin PROOF.bendsource · line 63 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.clamp_u8(1000) == 255 : U32}
law clamp_rgb_r_overflow provedin PROOF.bendsource · line 67 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb_r(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.clamp_rgb(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(300, 10, 400, 1.0))) == 255 : U32}clamp_rgb: only octet projections are definitional (alpha uses F32.clamp).
law clamp_rgb_g_ok provedin PROOF.bendsource · line 70 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb_g(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.clamp_rgb(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(300, 10, 400, 1.0))) == 10 : U32}
law clamp_rgb_b_overflow provedin PROOF.bendsource · line 73 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb_b(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.clamp_rgb(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(300, 10, 400, 1.0))) == 255 : U32}
law rgba_string_red provedin PROOF.bendsource · line 78 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.to_rgba_string(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(255, 0, 0, 1.0)) == String.append("rgba(255,0,0,", String.append(F32.show(1.0), ")")) : String}Stable rgba/hsla string shape. U32.show reduces; F32.show stays symbolic, so both sides keep matching F32.show calls.
law rgba_string_black provedin PROOF.bendsource · line 85 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.to_rgba_string(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(0, 0, 0, 0.0)) == String.append("rgba(0,0,0,", String.append(F32.show(0.0), ")")) : String}
law rgba_string_custom provedin PROOF.bendsource · line 92 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.to_rgba_string(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(12, 34, 56, 0.5)) == String.append("rgba(12,34,56,", String.append(F32.show(0.5), ")")) : String}
law rgba_starts_with_prefix provedin PROOF.bendsource · line 99 · raw
{String.starts_with(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.to_rgba_string(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.rgb(255, 128, 64, 1.0)), "rgba(") == True{} : Bool}
law hsla_string_green provedin PROOF.bendsource · line 108 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.to_hsla_string(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl(120.0, 1.0, 0.5, 1.0)) == String.append("hsla(", String.append(F32.show(120.0), String.append(",", String.append(F32.show(1.0), String.append(",", String.append(F32.show(0.5), String.append(",", String.append(F32.show(1.0), ")")))))))) : String}
law hsla_string_zero provedin PROOF.bendsource · line 116 · raw
{0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.to_hsla_string(0xc6ecb72f45a1b2f83318765698582f7f/lib.Color.hsl(0.0, 0.0, 0.0, 0.0)) == String.append("hsla(", String.append(F32.show(0.0), String.append(",", String.append(F32.show(0.0), String.append(",", String.append(F32.show(0.0), String.append(",", String.append(F32.show(0.0), ")")))))))) : String}