@@ -211,6 +211,18 @@ impl DeduktiExporter {
211211 Self :: term_to_dedukti( body)
212212 )
213213 } ,
214+ Term :: Sigma {
215+ param,
216+ param_type,
217+ body,
218+ } => {
219+ format ! (
220+ "(dk_sigma {} ({} => {}))" ,
221+ Self :: term_to_dedukti( param_type) ,
222+ param,
223+ Self :: term_to_dedukti( body)
224+ )
225+ } ,
214226 Term :: Type ( level) => format ! ( "Type {}" , level) ,
215227 Term :: Sort ( level) => format ! ( "Sort {}" , level) ,
216228 Term :: Universe ( level) => format ! ( "Type {}" , level) ,
@@ -224,6 +236,32 @@ impl DeduktiExporter {
224236 if trimmed. starts_with ( '(' ) && trimmed. ends_with ( ')' ) {
225237 // Unwrap parentheses and recurse
226238 Self :: dedukti_to_term ( & trimmed[ 1 ..trimmed. len ( ) - 1 ] )
239+ } else if trimmed. starts_with ( "dk_sigma " ) {
240+ // Sigma type: dk_sigma A (x => B)
241+ let rest = trimmed. trim_start_matches ( "dk_sigma " ) . trim ( ) ;
242+ // Split into the type part and the binder part (x => B)
243+ if let Some ( paren_start) = rest. find ( '(' ) {
244+ let type_part = rest[ ..paren_start] . trim ( ) ;
245+ let binder_part = rest[ paren_start..] . trim ( ) ;
246+ let inner = if binder_part. starts_with ( '(' ) && binder_part. ends_with ( ')' ) {
247+ & binder_part[ 1 ..binder_part. len ( ) - 1 ]
248+ } else {
249+ binder_part
250+ } ;
251+ if let Some ( arrow_pos) = inner. find ( "=>" ) {
252+ let param = inner[ ..arrow_pos] . trim ( ) . to_string ( ) ;
253+ let body_str = inner[ arrow_pos + 2 ..] . trim ( ) ;
254+ Term :: Sigma {
255+ param,
256+ param_type : Box :: new ( Self :: dedukti_to_term ( type_part) ) ,
257+ body : Box :: new ( Self :: dedukti_to_term ( body_str) ) ,
258+ }
259+ } else {
260+ Term :: Const ( trimmed. to_string ( ) )
261+ }
262+ } else {
263+ Term :: Const ( trimmed. to_string ( ) )
264+ }
227265 } else if trimmed. contains ( "->" ) {
228266 // Pi type: A -> B
229267 let parts: Vec < & str > = trimmed. splitn ( 2 , "->" ) . collect ( ) ;
@@ -416,6 +454,28 @@ mod tests {
416454 assert_eq ! ( dk, "x" ) ;
417455 }
418456
457+ #[ test]
458+ fn test_term_to_dedukti_sigma ( ) {
459+ let term = Term :: Sigma {
460+ param : "x" . to_string ( ) ,
461+ param_type : Box :: new ( Term :: Const ( "Nat" . to_string ( ) ) ) ,
462+ body : Box :: new ( Term :: Const ( "Prop" . to_string ( ) ) ) ,
463+ } ;
464+ let dk = DeduktiExporter :: term_to_dedukti ( & term) ;
465+ assert ! ( dk. contains( "dk_sigma" ) , "Sigma should render as dk_sigma, got: {}" , dk) ;
466+ assert ! ( dk. contains( "Nat" ) , "Sigma param type should appear, got: {}" , dk) ;
467+ }
468+
469+ #[ test]
470+ fn test_dedukti_to_term_sigma ( ) {
471+ let dk = "dk_sigma Nat (x => Prop)" ;
472+ let term = DeduktiExporter :: dedukti_to_term ( dk) ;
473+ match term {
474+ Term :: Sigma { ref param, .. } => assert_eq ! ( param, "x" ) ,
475+ _ => panic ! ( "Expected Sigma term, got: {:?}" , term) ,
476+ }
477+ }
478+
419479 #[ test]
420480 fn test_import_with_definition ( ) {
421481 let module = DeduktiModule {
0 commit comments