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)