packages feed

phino-0.0.152: test-resources/evaluate-packs/cuts-a-loop-over-unknown-data-on-its-second-round.yaml

# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
# SPDX-License-Identifier: MIT
---
# yamllint disable rule:line-length
# A loop walking an index from zero up to a size that is a symbol, under
# '--acyclic=plausible'. The first round holds the number '0', the second holds
# the symbol 'plus' answered in its place, and a symbol stands for a term that
# holds no symbol of its own, so the fork of the second round is cut against
# the fork of the first one rather than a round later (#1491). The cut fork is
# the Ο† of a copy of 'rec', so the cut answers that copy with a fresh symbol,
# which the 'join' of the first fork pairs with the other branch (#1735).
symbolic: |
  - Ξ»: L_id
    morph:
      𝑛1: $.x.Ο†
    𝑛: 𝑛1
  - Ξ»: L_plus
    dataize:
      𝛿1: $.ρ
      𝛿2: $.b
    𝑛: Ξ¦.num( Ο† ↦ ⟦ Ξ» ‍ 𝜎 ⟧ )
  - Ξ»: L_eq
    dataize:
      𝛿1: $.ρ
      𝛿2: $.b
    𝑛: ⟦ Ο† ↦ Ξ¦.bool( if ↦ ⟦ Ξ» ‍ L_fork, left ↦ βˆ…, right ↦ βˆ…, Ο† ↦ ⟦ Ξ» ‍ 𝜎 ⟧ ⟧ ) ⟧
  - Ξ»: L_fork
    dataize:
      𝛿1: $.Ο†
    morph:
      𝑛1: $.left
      𝑛2: $.right
    symbolize:
      𝑛3: 𝑛1
      𝑛4: 𝑛2
    join:
      𝑛5: [𝑛3, 𝑛4]
    𝑛: 𝑛5
location: 'Q.a'
deep: true
acyclic: plausible
partial: true
steps: 32
input: >
  ⟦ num ↦ ⟦ Ο† ↦ βˆ…, plus ↦ ⟦ ρ ↦ βˆ…, b ↦ βˆ…, Ξ» ‍ L_plus ⟧, eq ↦ ⟦ ρ ↦ βˆ…, b ↦ βˆ…, Ξ» ‍ L_eq ⟧ ⟧,
    bool ↦ ⟦ Ο† ↦ βˆ…, if ↦ βˆ… ⟧,
    count ↦ ⟦ size ↦ βˆ…, Ο† ↦ ΞΎ.rec( index ↦ Ξ¦.num( Ο† ↦ ⟦ Ξ” ‍ 00- ⟧ ), accum ↦ Ξ¦.num( Ο† ↦ ⟦ Ξ” ‍ 00- ⟧ ) ), rec ↦ ⟦ ρ ↦ βˆ…, index ↦ βˆ…, accum ↦ βˆ…, Ο† ↦ ΞΎ.index.eq( ΞΎ.ρ.size ).if( ΞΎ.accum, ΞΎ.ρ.rec( index ↦ ΞΎ.index.plus( Ξ¦.num( Ο† ↦ ⟦ Ξ” ‍ 01- ⟧ ) ), accum ↦ ΞΎ.accum.plus( Ξ¦.num( Ο† ↦ ⟦ Ξ” ‍ 01- ⟧ ) ) ) ) ⟧ ⟧,
    a ↦ ⟦ Ξ» ‍ L_id, x ↦ Ξ¦.count( size ↦ Ξ¦.num( Ο† ↦ ⟦ Ξ» ‍ 𝜎1 ⟧ ) ) ⟧ ⟧
protocol: |
  𝕄(Ξ¦.a):
    𝕄(Ξ¦.a.x):
      𝑛·0Β·1 := Ξ¦.num( Ο† ↦ 𝜎1:Ξ» )
      𝑛·0Β·2 := Ξ¦.count( size ↦ 𝑛·0Β·1 )
    𝔼(L_id):
      𝕄(Ξ¦.a🌡0):
        𝑛·1Β·1 := Ξ¦.count( size ↦ 𝑛·0Β·1 )
        𝑛·1Β·2 := ⟦ index ↦ βˆ…, accum ↦ βˆ…, Ο† ↦ index.eq( ρ.size ).if( accum, ρ.rec( index ↦ index.plus( Ξ¦.num( Ο† ↦ 01-:Ξ” ) ), accum ↦ accum.plus( Ξ¦.num( Ο† ↦ 01-:Ξ” ) ) ) ) ⟧( index ↦ Ξ¦.num( Ο† ↦ 00-:Ξ” ) )
        𝑛·1Β·3 := 𝑛·1Β·2( accum ↦ Ξ¦.num( Ο† ↦ 00-:Ξ” ) )
        𝕄(Ξ¦.a🌡0.index):
          𝑛·1Β·4 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
        𝕄(Ξ¦.a🌡0.accum):
          𝑛·1Β·5 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
        𝕄(Ξ¦.a🌡0.Ο†):
          𝑛·1Β·6 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·7 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·8 := Ξ¦.num( Ο† ↦ 𝜎1:Ξ» )
          𝑛·1Β·9 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·10 := 𝑛·1Β·9.eq( b ↦ 𝑛·1Β·8 )
          𝔼(L_eq):
            𝔻(Ξ¦.a🌡1):
              𝕄(Ξ¦.a🌡1):
                𝑛·2Β·1 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
              𝛿·2Β·1 := 00-
            𝛿1Β·2 := 𝛿·2Β·1  # 𝔻(ΞΎ.ρ)
            𝔻(Ξ¦.a🌡2):
              𝕄(Ξ¦.a🌡2):
                𝑛·2Β·2 := Ξ¦.num( Ο† ↦ 𝜎1:Ξ» )
            𝛿2Β·2 := 𝔻(𝜎1:Ξ»)  # 𝔻(ΞΎ.b)
            𝑛·2Β·3 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎2:Ξ» ⟧ ):Ο†  # 𝑛
            𝑛·2Β·4 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎2:Ξ» ⟧ ):Ο†  # 𝕄(𝑛·2Β·3)
          𝑛·1Β·11 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎2:Ξ» ⟧ )
          𝑛·1Β·12 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·13 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎2:Ξ» ⟧ )
          𝑛·1Β·14 := ⟦ Ξ» ‍ L_fork, left ↦ βˆ…, right ↦ βˆ…, Ο† ↦ 𝜎2:Ξ» ⟧( left ↦ 𝑛·1Β·12 )
          𝑛·1Β·15 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·16 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·17 := Ξ¦.num( Ο† ↦ 01-:Ξ” )
          𝑛·1Β·18 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·19 := 𝑛·1Β·18.plus( b ↦ 𝑛·1Β·17 )
          𝔼(L_plus):
            𝔻(Ξ¦.a🌡3):
              𝕄(Ξ¦.a🌡3):
                𝑛·3Β·1 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
              𝛿·3Β·1 := 00-
            𝛿1Β·3 := 𝛿·3Β·1  # 𝔻(ΞΎ.ρ)
            𝔻(Ξ¦.a🌡4):
              𝕄(Ξ¦.a🌡4):
                𝑛·3Β·2 := Ξ¦.num( Ο† ↦ 01-:Ξ” )
              𝛿·3Β·2 := 01-
            𝛿2Β·3 := 𝛿·3Β·2  # 𝔻(ΞΎ.b)
            𝑛·3Β·3 := Ξ¦.num( Ο† ↦ 𝜎3:Ξ» )  # 𝑛
            𝕄(𝑛·3Β·3):
              𝑛·3Β·4 := Ξ¦.num( Ο† ↦ 𝜎3:Ξ» )
            𝑛·3Β·5 := 𝑛·3Β·4  # 𝕄(𝑛·3Β·3)
          𝑛·1Β·20 := ⟦ index ↦ βˆ…, accum ↦ βˆ…, Ο† ↦ index.eq( ρ.size ).if( accum, ρ.rec( index ↦ index.plus( 𝑛·3Β·2 ), accum ↦ accum.plus( 𝑛·3Β·2 ) ) ) ⟧( index ↦ 𝑛·3Β·4 )
          𝑛·1Β·21 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·22 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·23 := Ξ¦.num( Ο† ↦ 01-:Ξ” )
          𝑛·1Β·24 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
          𝑛·1Β·25 := 𝑛·1Β·24.plus( b ↦ 𝑛·1Β·23 )
          𝔼(L_plus):
            𝑛·4Β·1 := 𝑛·3Β·4  # 𝑛
            𝑛·4Β·2 := 𝑛·3Β·5  # 𝕄(𝑛·4Β·1)
          𝑛·1Β·26 := ⟦ index ↦ βˆ…, accum ↦ βˆ…, Ο† ↦ index.eq( ρ.size ).if( accum, ρ.rec( index ↦ index.plus( 𝑛·1Β·23 ), accum ↦ accum.plus( 𝑛·1Β·23 ) ) ) ⟧( index ↦ 𝑛·3Β·4 )
          𝑛·1Β·27 := 𝑛·1Β·26( accum ↦ 𝑛·3Β·4 )
          𝑛·1Β·28 := ⟦ index ↦ βˆ…, accum ↦ βˆ…, Ο† ↦ index.eq( ρ.size ).if( accum, ρ.rec( index ↦ index.plus( 𝑛·1Β·23 ), accum ↦ accum.plus( 𝑛·1Β·23 ) ) ) ⟧( index ↦ 𝑛·3Β·4 )
          𝑛·1Β·29 := 𝑛·1Β·28( accum ↦ 𝑛·3Β·4 )
          𝑛·1Β·30 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎2:Ξ» ⟧ )
          𝑛·1Β·31 := ⟦ Ξ» ‍ L_fork, left ↦ βˆ…, right ↦ βˆ…, Ο† ↦ 𝜎2:Ξ» ⟧( left ↦ 𝑛·1Β·24 )
          𝑛·1Β·32 := 𝑛·1Β·31( right ↦ 𝑛·1Β·29 )
          𝔼(L_fork):
            𝛿1Β·5 := 𝔻(𝜎2:Ξ»)  # 𝔻(ΞΎ.Ο†)
            𝕄(Ξ¦.a🌡6):
              𝑛·5Β·1 := Ξ¦.num( Ο† ↦ 00-:Ξ” )
            𝑛1Β·5 := 𝑛·5Β·1  # 𝕄(ΞΎ.left)
            𝕄(Ξ¦.a🌡7):
              𝕄(Ξ¦.a🌡7.Ο†):
                𝑛·5Β·2 := Ξ¦.num( Ο† ↦ 𝜎1:Ξ» )
                𝑛·5Β·3 := 𝑛·3Β·4.eq( b ↦ 𝑛·5Β·2 )
                𝔼(L_eq):
                  𝔻(Ξ¦.a🌡8):
                    𝕄(Ξ¦.a🌡8):
                      𝑛·6Β·1 := Ξ¦.num( Ο† ↦ 𝜎3:Ξ» )
                  𝛿1Β·6 := 𝔻(𝜎3:Ξ»)  # 𝔻(ΞΎ.ρ)
                  𝔻(Ξ¦.a🌡9):
                    𝕄(Ξ¦.a🌡9):
                      𝑛·6Β·2 := Ξ¦.num( Ο† ↦ 𝜎1:Ξ» )
                  𝛿2Β·6 := 𝔻(𝜎1:Ξ»)  # 𝔻(ΞΎ.b)
                  𝑛·6Β·3 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎4:Ξ» ⟧ ):Ο†  # 𝑛
                  𝑛·6Β·4 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎4:Ξ» ⟧ ):Ο†  # 𝕄(𝑛·6Β·3)
                𝑛·5Β·4 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎4:Ξ» ⟧ )
                𝑛·5Β·5 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎4:Ξ» ⟧ )
                𝑛·5Β·6 := ⟦ Ξ» ‍ L_fork, left ↦ βˆ…, right ↦ βˆ…, Ο† ↦ 𝜎4:Ξ» ⟧( left ↦ 𝑛·6Β·1 )
                𝑛·5Β·7 := Ξ¦.num( Ο† ↦ 01-:Ξ” )
                𝑛·5Β·8 := 𝑛·6Β·1.plus( b ↦ 𝑛·5Β·7 )
                𝔼(L_plus):
                  𝔻(Ξ¦.a🌡10):
                    𝕄(Ξ¦.a🌡10):
                      𝑛·7Β·1 := Ξ¦.num( Ο† ↦ 𝜎3:Ξ» )
                  𝛿1Β·7 := 𝔻(𝜎3:Ξ»)  # 𝔻(ΞΎ.ρ)
                  𝔻(Ξ¦.a🌡11):
                    𝕄(Ξ¦.a🌡11):
                      𝑛·7Β·2 := Ξ¦.num( Ο† ↦ 01-:Ξ” )
                    𝛿·7Β·1 := 01-
                  𝛿2Β·7 := 𝛿·7Β·1  # 𝔻(ΞΎ.b)
                  𝑛·7Β·3 := Ξ¦.num( Ο† ↦ 𝜎5:Ξ» )  # 𝑛
                  𝕄(𝑛·7Β·3):
                    𝑛·7Β·4 := Ξ¦.num( Ο† ↦ 𝜎5:Ξ» )
                  𝑛·7Β·5 := 𝑛·7Β·4  # 𝕄(𝑛·7Β·3)
                𝑛·5Β·9 := ⟦ index ↦ βˆ…, accum ↦ βˆ…, Ο† ↦ index.eq( ρ.size ).if( accum, ρ.rec( index ↦ index.plus( 𝑛·7Β·2 ), accum ↦ accum.plus( 𝑛·7Β·2 ) ) ) ⟧( index ↦ 𝑛·7Β·4 )
                𝑛·5Β·10 := Ξ¦.num( Ο† ↦ 01-:Ξ” )
                𝑛·5Β·11 := 𝑛·7Β·1.plus( b ↦ 𝑛·5Β·10 )
                𝔼(L_plus):
                  𝑛·8Β·1 := 𝑛·7Β·4  # 𝑛
                  𝑛·8Β·2 := 𝑛·7Β·5  # 𝕄(𝑛·8Β·1)
                𝑛·5Β·12 := ⟦ index ↦ βˆ…, accum ↦ βˆ…, Ο† ↦ index.eq( ρ.size ).if( accum, ρ.rec( index ↦ index.plus( 𝑛·5Β·10 ), accum ↦ accum.plus( 𝑛·5Β·10 ) ) ) ⟧( index ↦ 𝑛·7Β·4 )
                𝑛·5Β·13 := 𝑛·5Β·12( accum ↦ 𝑛·7Β·4 )
                𝑛·5Β·14 := ⟦ index ↦ βˆ…, accum ↦ βˆ…, Ο† ↦ index.eq( ρ.size ).if( accum, ρ.rec( index ↦ index.plus( 𝑛·5Β·10 ), accum ↦ accum.plus( 𝑛·5Β·10 ) ) ) ⟧( index ↦ 𝑛·7Β·4 )
                𝑛·5Β·15 := 𝑛·5Β·14( accum ↦ 𝑛·7Β·4 )
                𝑛·5Β·16 := Ξ¦.bool( if(left, right) ↦ ⟦ Ξ» ‍ L_fork, Ο† ↦ 𝜎4:Ξ» ⟧ )
                𝑛·5Β·17 := ⟦ Ξ» ‍ L_fork, left ↦ βˆ…, right ↦ βˆ…, Ο† ↦ 𝜎4:Ξ» ⟧( left ↦ 𝑛·7Β·1 )
                𝑛·5Β·18 := 𝑛·5Β·17( right ↦ 𝑛·5Β·15 )
                looped(𝑛·1Β·32) := 𝜎6  # plausible
            𝑛2Β·5 := 𝜎6:Ξ»  # 𝕄(ΞΎ.right)
            𝔻(𝜎7:Ξ») == 00-
            𝑛3Β·5 := ⟦ Ο† ↦ 𝜎7:Ξ», plus(b) ↦ L_plus:Ξ», eq(b) ↦ L_eq:Ξ» ⟧  # 𝑛1
            𝑛4Β·5 := 𝑛2Β·5  # 𝑛2
            𝔻(𝜎8:Ξ») ∈ { 𝔻(𝜎7:Ξ»), 𝔻(𝜎6:Ξ») }
            𝑛5Β·5 := 𝜎8:Ξ»  # [𝑛3, 𝑛4]
            𝑛·5Β·19 := 𝑛5Β·5  # 𝑛
            𝑛·5Β·20 := 𝑛5Β·5  # 𝕄(𝑛·5Β·19)
      𝑛1Β·1 := 𝑛·1Β·3  # 𝕄(ΞΎ.x.Ο†)
      𝑛·1Β·33 := 𝑛1Β·1  # 𝑛
      𝑛·1Β·34 := 𝑛1Β·1  # 𝕄(𝑛·1Β·33)