@@ -357,17 +357,28 @@ def _def_binders(self, defs: Mapping[str, Pattern]) -> list[Binder]:
357
357
for ident , pattern in defs .items ()
358
358
]
359
359
360
- def _transform_pattern (self , pattern : Pattern ) -> Term :
360
+ def _transform_pattern (self , pattern : Pattern , * , concrete : bool = False ) -> Term :
361
361
match pattern :
362
362
case EVar (name ):
363
363
return self ._transform_evar (name )
364
364
case DV (SortApp (sort ), String (value )):
365
365
return self ._transform_dv (sort , value )
366
366
case App (symbol , sorts , args ):
367
- return self ._transform_app (symbol , sorts , args )
367
+ return self ._transform_app (symbol , sorts , args , concrete = concrete )
368
368
case _:
369
369
raise ValueError (f'Unsupported pattern: { pattern .text } ' )
370
370
371
+ def _transform_arg (self , pattern : Pattern , * , concrete : bool = False ) -> Term :
372
+ term = self ._transform_pattern (pattern , concrete = concrete )
373
+
374
+ if not isinstance (pattern , App ):
375
+ return term
376
+
377
+ if pattern .symbol in self .structure_symbols :
378
+ return term
379
+
380
+ return Term (f'({ term } )' )
381
+
371
382
def _transform_evar (self , name : str ) -> Term :
372
383
return Term (_var_ident (name ))
373
384
@@ -418,47 +429,47 @@ def encode(c: str) -> str:
418
429
encoded = '' .join (encode (c ) for c in value )
419
430
return Term (f'"{ encoded } "' )
420
431
421
- def _transform_app (self , symbol : str , sorts : tuple [Sort , ...], args : tuple [Pattern , ...]) -> Term :
432
+ def _transform_app (
433
+ self ,
434
+ symbol : str ,
435
+ sorts : tuple [Sort , ...],
436
+ args : tuple [Pattern , ...],
437
+ * ,
438
+ concrete : bool ,
439
+ ) -> Term :
422
440
if symbol == 'inj' :
423
- return self ._transform_inj_app (sorts , args )
441
+ return self ._transform_inj_app (sorts , args , concrete = concrete )
424
442
425
443
if symbol in self .structure_symbols :
426
444
fields = self .structures [self .structure_symbols [symbol ]]
427
- return self ._transform_structure_app (fields , args )
445
+ return self ._transform_structure_app (fields , args , concrete = concrete )
428
446
429
447
decl = self .defn .symbols [symbol ]
430
448
sort = decl .sort .name if isinstance (decl .sort , SortApp ) else None
431
- return self ._transform_basic_app (sort , symbol , args )
432
-
433
- def _transform_arg (self , pattern : Pattern ) -> Term :
434
- term = self ._transform_pattern (pattern )
449
+ return self ._transform_basic_app (sort , symbol , args , concrete = concrete )
435
450
436
- if not isinstance (pattern , App ):
437
- return term
438
-
439
- if pattern .symbol in self .structure_symbols :
440
- return term
441
-
442
- return Term (f'({ term } )' )
443
-
444
- def _transform_inj_app (self , sorts : tuple [Sort , ...], args : tuple [Pattern , ...]) -> Term :
451
+ def _transform_inj_app (self , sorts : tuple [Sort , ...], args : tuple [Pattern , ...], * , concrete : bool ) -> Term :
445
452
_from_sort , _to_sort = sorts
446
453
assert isinstance (_from_sort , SortApp )
447
454
assert isinstance (_to_sort , SortApp )
448
455
from_str = _from_sort .name
449
456
to_str = _to_sort .name
450
457
(arg ,) = args
451
- term = self ._transform_arg (arg )
452
- return Term (f'(@inj { from_str } { to_str } ) { term } ' )
458
+ term = self ._transform_arg (arg , concrete = concrete )
459
+ if concrete :
460
+ return Term (f'{ to_str } .inj_{ from_str } { term } ' )
461
+ else :
462
+ return Term (f'(@inj { from_str } { to_str } ) { term } ' )
453
463
454
- def _transform_structure_app (self , fields : Iterable [Field ], args : Iterable [Pattern ]) -> Term :
464
+ def _transform_structure_app (self , fields : Iterable [Field ], args : Iterable [Pattern ], * , concrete : bool ) -> Term :
455
465
fields_str = ', ' .join (
456
- f'{ field .name } := { self ._transform_pattern (arg )} ' for field , arg in zip (fields , args , strict = True )
466
+ f'{ field .name } := { self ._transform_pattern (arg , concrete = concrete )} '
467
+ for field , arg in zip (fields , args , strict = True )
457
468
)
458
469
lbrace , rbrace = ['{' , '}' ]
459
470
return Term (f'{ lbrace } { fields_str } { rbrace } ' )
460
471
461
- def _transform_basic_app (self , sort : str | None , symbol : str , args : Iterable [Pattern ]) -> Term :
472
+ def _transform_basic_app (self , sort : str | None , symbol : str , args : Iterable [Pattern ], * , concrete : bool ) -> Term :
462
473
chunks = []
463
474
464
475
ident : str
@@ -469,7 +480,7 @@ def _transform_basic_app(self, sort: str | None, symbol: str, args: Iterable[Pat
469
480
ident = _symbol_ident (symbol )
470
481
471
482
chunks .append (ident )
472
- chunks .extend (str (self ._transform_arg (arg )) for arg in args )
483
+ chunks .extend (str (self ._transform_arg (arg , concrete = concrete )) for arg in args )
473
484
return Term (' ' .join (chunks ))
474
485
475
486
0 commit comments