fix: wrap data reduce had the wrong argument called in recursively, thus skipping over cases that should have been reduced

chore: Add unit tests on for uplc optimizations
This commit is contained in:
microproofs 2023-04-26 17:22:16 -04:00
parent af14d8be2e
commit c3184c544c
2 changed files with 182 additions and 11 deletions

View File

@ -272,13 +272,10 @@ fn wrap_data_reduce(term: &mut Term<Name>) {
let Term::Builtin(second_action) = inner_func.as_ref()
else {
wrap_data_reduce(Rc::make_mut(inner_func));
wrap_data_reduce(Rc::make_mut(inner_arg));
wrap_data_reduce(Rc::make_mut(argument));
return;
};
wrap_data_reduce(Rc::make_mut(inner_arg));
match (first_action, second_action) {
(DefaultFunction::UnIData, DefaultFunction::IData)
| (DefaultFunction::IData, DefaultFunction::UnIData)
@ -290,9 +287,12 @@ fn wrap_data_reduce(term: &mut Term<Name>) {
| (DefaultFunction::UnMapData, DefaultFunction::MapData)
| (DefaultFunction::UnConstrData, DefaultFunction::ConstrData)
| (DefaultFunction::ConstrData, DefaultFunction::UnConstrData) => {
wrap_data_reduce(Rc::make_mut(inner_arg));
*term = inner_arg.as_ref().clone();
}
_ => {}
_ => {
wrap_data_reduce(Rc::make_mut(argument));
}
}
}
Term::Force(f) => {
@ -407,3 +407,174 @@ fn substitute_term(term: &Term<Name>, original: Rc<Name>, replace_with: &Term<Na
x => x.clone(),
}
}
#[cfg(test)]
mod test {
use pallas_primitives::babbage::{BigInt, PlutusData};
use crate::ast::{Constant, Name, NamedDeBruijn, Program, Term};
#[test]
fn lambda_reduce_var() {
let program: Program<NamedDeBruijn> = Program {
version: (1, 0, 0),
term: Term::var("bar")
.lambda("bar")
.apply(Term::var("foo"))
.lambda("foo")
.apply(
Term::constr_data()
.apply(Term::integer(3.into()))
.apply(Term::list_values(vec![])),
),
}
.try_into()
.unwrap();
let program: Program<Name> = program.try_into().unwrap();
let expected = Program {
version: (1, 0, 0),
term: Term::var("foo").lambda("foo").apply(
Term::constr_data()
.apply(Term::integer(3.into()))
.apply(Term::list_values(vec![])),
),
};
let expected: Program<NamedDeBruijn> = expected.try_into().unwrap();
let actual = program.lambda_reduce();
let actual: Program<NamedDeBruijn> = actual.try_into().unwrap();
assert_eq!(actual, expected);
}
#[test]
fn lambda_reduce_constant() {
let program: Program<NamedDeBruijn> = Program {
version: (1, 0, 0),
term: Term::var("foo")
.lambda("foo")
.apply(Term::integer(6.into())),
}
.try_into()
.unwrap();
let program: Program<Name> = program.try_into().unwrap();
let expected: Program<Name> = Program {
version: (1, 0, 0),
term: Term::integer(6.into()),
};
let expected: Program<NamedDeBruijn> = expected.try_into().unwrap();
let actual = program.lambda_reduce();
let actual: Program<NamedDeBruijn> = actual.try_into().unwrap();
assert_eq!(actual, expected);
}
#[test]
fn lambda_reduce_builtin() {
let program: Program<NamedDeBruijn> = Program {
version: (1, 0, 0),
term: Term::var("foo").lambda("foo").apply(Term::add_integer()),
}
.try_into()
.unwrap();
let program: Program<Name> = program.try_into().unwrap();
let expected: Program<Name> = Program {
version: (1, 0, 0),
term: Term::add_integer(),
};
let expected: Program<NamedDeBruijn> = expected.try_into().unwrap();
let actual = program.lambda_reduce();
let actual: Program<NamedDeBruijn> = actual.try_into().unwrap();
assert_eq!(actual, expected);
}
#[test]
fn lambda_reduce_force_delay_error_lam() {
let program: Program<NamedDeBruijn> = Program {
version: (1, 0, 0),
term: Term::var("foo")
.apply(Term::var("bar"))
.apply(Term::var("baz"))
.apply(Term::var("bat"))
.lambda("foo")
.apply(Term::snd_pair())
.lambda("bar")
.apply(Term::integer(1.into()).delay())
.lambda("baz")
.apply(Term::Error)
.lambda("bat")
.apply(Term::bool(false).lambda("x")),
}
.try_into()
.unwrap();
let program: Program<Name> = program.try_into().unwrap();
let expected = Program {
version: (1, 0, 0),
term: Term::var("foo")
.apply(Term::var("bar"))
.apply(Term::var("baz"))
.apply(Term::var("bat"))
.lambda("foo")
.apply(Term::snd_pair())
.lambda("bar")
.apply(Term::integer(1.into()).delay())
.lambda("baz")
.apply(Term::Error)
.lambda("bat")
.apply(Term::bool(false).lambda("x")),
};
let expected: Program<NamedDeBruijn> = expected.try_into().unwrap();
let actual = program.lambda_reduce();
let actual: Program<NamedDeBruijn> = actual.try_into().unwrap();
assert_eq!(actual, expected);
}
#[test]
fn wrap_data_reduce_i_data() {
let program: Program<NamedDeBruijn> = Program {
version: (1, 0, 0),
term: Term::equals_data()
.apply(Term::i_data().apply(Term::un_i_data().apply(Term::Constant(
Constant::Data(PlutusData::BigInt(BigInt::Int(5.into()))).into(),
))))
.apply(Term::i_data().apply(Term::integer(1.into())))
.lambda("x"),
}
.try_into()
.unwrap();
let program: Program<Name> = program.try_into().unwrap();
let expected = Program {
version: (1, 0, 0),
term: Term::equals_data()
.apply(Term::Constant(
Constant::Data(PlutusData::BigInt(BigInt::Int(5.into()))).into(),
))
.apply(Term::i_data().apply(Term::integer(1.into())))
.lambda("x"),
};
let expected: Program<NamedDeBruijn> = expected.try_into().unwrap();
let actual = program.wrap_data_reduce();
let actual: Program<NamedDeBruijn> = actual.try_into().unwrap();
assert_eq!(actual, expected);
}
}

View File

@ -19,8 +19,8 @@
"$ref": "#/definitions/Void"
}
},
"compiledCode": "59043101000032323232323232323232322223232533300a32300200132323232323233014333010323330113375e6601a601e002900b26126d8799f58200000000000000000000000000000000000000000000000000000000000000000ff004a0944cc030c03802520004c0103d87a80004c0103d879800033014333010323253330123370e900100089919299980a19baf33010301200148001300126d8799f58200000000000000000000000000000000000000000000000000000000000000000ff0013370e6eb4cc040c048005200248000528180c00098080010b1808000998061807004a4004980103d87a80004c0103d8798000330143330103232533301500116132533301600113232300c001330183330143375e6e98dd5998081809000a40046e98c0152080a8d6b9074c0103d87a80004c0103d8798000330183330143375e660206024660206024002900024000980122d8799f581c11111111111111111111111111111111111111111111111111111111ff004c0103d87a80004c0103d879800033018333014323253330163370e9000000899250301400214a26028002660206024660206024002900024004980103d87a80004c0103d8798000330183330143375e6602060240029002260103d87980004c0103d87a80004c0103d8798000330183330143375e6602060240029003260103d87a80004c0103d87a80004c0103d87980004bd70180c0010b180c0009bac3300d300f00148010cc030c03802520004c0103d87a80004c0103d879800033014333010323375e6e98dd5998069807800a400c6e98c00920543300c300e0094800130103d87a80004c0103d87980004bd701299980819b870014800052f5bded8c026464002666600697adef6c6048810000100533330054bd6f7b630245000010043001001222225333015004133016337606ea400cdd300125eb7bdb1804c8c8c8c94ccc058cdd799802803800a60103d879800013301a337606ea401cdd30030040a99980b19b8f00700113301a337606ea401cdd300300189980d19bb037520026e98008ccccc02402400c01c018014dd7180b0019bab30160023019005301700422533300e33720004002298103d87980001533300e3371e0040022980103d87a800014c103d87b80003001001222225333012004133013337606ea400cdd400125eb7bdb1804c8c8c8c94ccc04ccdd799802803800a60103d8798000133017337606ea401cdd40030040a99980999b8f007001133017337606ea401cdd400300189980b99bb037520026ea0008ccccc02402400c01c018014dd718098019bad301300230160053014004149858c004004894ccc0340045288991929998060010998020020008a5030110023370e900118059baa300f00133001001480008888cccc01ccdc38008018061199980280299b8000448008c0380040080088c014dd5000918019baa0015734aae7555cf2ab9f5740ae855d101",
"hash": "4754ec17281476ed88d38ce54a6fb1d104956a0f3ce64bdd38dc374b"
"compiledCode": "59042601000032323232323232323232322223232533300a32300200132323232323233014333010323330113375e6601a601e002900b26126d8799f58200000000000000000000000000000000000000000000000000000000000000000ff004a0944cc030c03802520004c0103d87a80004c0103d879800033014333010323253330123370e900100089919299980a19baf33010301200148001300126d8799f58200000000000000000000000000000000000000000000000000000000000000000ff0013370e6eb4cc040c048005200248000528180c00098080010b1808000998061807004a4004980103d87a80004c0103d8798000330143330103232533301500116132533301600113232300c001330183330143375e66020602400290011ba6300548202a35ae41d30103d87a80004c0103d8798000330183330143375e660206024660206024002900024000980122d8799f581c11111111111111111111111111111111111111111111111111111111ff004c0103d87a80004c0103d879800033018333014323253330163370e9000000899250301400214a26028002660206024660206024002900024004980103d87a80004c0103d8798000330183330143375e6602060240029002260103d87980004c0103d87a80004c0103d8798000330183330143375e6602060240029003260103d87a80004c0103d87a80004c0103d87980004bd70180c0010b180c0009bac3300d300f00148010cc030c03802520004c0103d87a80004c0103d879800033014333010323375e6601a601e00290031ba6300248150cc030c03802520004c103d87a80004c0103d87980004bd701299980819b870014800052f5bded8c0264666600697adef6c604890000100533330054bd6f7b630245000010043001001222225333015004133016337606ea400cdd300125eb7bdb1804c8c8c8c94ccc058cdd799802803800a60103d879800013301a337606ea401cdd30030040a99980b19b8f00700113301a337606ea401cdd300300189980d19bb037520026e98008ccccc02402400c01c018014dd7180b0019bab30160023019005301700422533300e33720004002298103d87980001533300e3371e0040022980103d87a800014c103d87b80003001001222225333012004133013337606ea400cdd400125eb7bdb1804c8c8c8c94ccc04ccdd799802803800a60103d8798000133017337606ea401cdd40030040a99980999b8f007001133017337606ea401cdd400300189980b99bb037520026ea0008ccccc02402400c01c018014dd718098019bad301300230160053014004149858c004004894ccc0340045288991929998060010998020020008a5030110023370e900118059baa300f00133001001480008888cccc01ccdc38008018061199980280299b8000448008c0380040080088c014dd5000918019baa0015734aae7555cf2ab9f5740ae855d101",
"hash": "a951e998cfc3a7263a800dbc24c992ef1e756df8abd6e269318b86fe"
},
{
"title": "deploy.spend",
@ -47,8 +47,8 @@
"$ref": "#/definitions/Data"
}
},
"compiledCode": "5904420100003232323232323232323232322253330073233232001300100122533300e00114a226464a6660180042660080080022940c048008cdc3a400460186ea8c040004004cc030ccc01ccc8c8c8c88c8c94ccc048c0540084c8c8cdc78018009bae3015001300c32533300f3370e9000180700088008a9980824812a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163300a300c0034800854cc03d2401334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375c602600264646008002640026600a002911003756660106014660106014002900024010600200244a66601e002297ae01323232323301437520026600c00c0066eb8c04000cdd5980800118098011808800980080091129998070010a5eb7bdb1804c8c8c8c94ccc038cdc7802800880189980999bb037520026e98008ccc01c01c00c014dd718078019bab300f002301200330100020014c0103d87a80004c0103d87980003300c333007333232323222323232323253330123370e90010008b0991919b87001483c850dd6980c8009808001180800099803000a44103666f6f003322323253330133370e90010008a5eb7bdb1804c8c8004dd5980d00098088011808800998048010009bab3300b300d00348020004dd7180a0009805a99980699b8748000c030008400854cc0392412a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163001001222533301000214c103d87a800013232323253330103371e00a002266e95200033015375000497ae01333007007003005375c60220066eb4c044008c05000cc048008c0040048894ccc038008530103d87a8000132323232533300e3371e00a002266e95200033013374c00497ae01333007007003005375c601e0066eacc03c008c04800cc040008cc00cc01400520023300330050014800130103d87a80004c0103d87980003300c3330073332323232223232533300f3375e006002266e1cc8c018004dd5998059806998059806802240009009240042940c050004c02cc94ccc038cdc3a4000601a00220022a6601e9212a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163322330070020013756660126016660126016004900024024660126016004900118008009129998078008a400026466e0120023300300300130120013001001222533300e00214c103d87a8000132323232533300e3375e00a002266e952000330130024bd7009998038038018029807801980780118090019808001000801260103d87a80004c0103d87980004bd700a4c2c6600200290001111199980399b8700100300d233330050053370000890011807800801001118031baa001230043754002ae695ce2ab9d5573caae7d5d02ba157441",
"hash": "02453d96bfd2a70fafb09509dfd6aff0e282b56dee20e1568cba1571"
"compiledCode": "59043b01000032323232323232323232323222533300732332300100122533300e00114a226464a6660180042660080080022940c048008cdc3a400460186ea8c040004004cc030ccc01ccc8c8c8c88c8c94ccc048c0540084c8c8cdc78018009bae3015001300c32533300f3370e9000180700088008a998082492a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163300a300c0034800854cc03d2401334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375c6026002646460080026600a0029101003756660106014660106014002900024010600200244a66601e002297ae01323232323301437520026600c00c0066eb8c04000cdd5980800118098011808800980080091129998070010a5eb7bdb1804c8c8c8c94ccc038cdc7802800880189980999bb037520026e98008ccc01c01c00c014dd718078019bab300f002301200330100020014c0103d87a80004c0103d87980003300c333007333232323222323232323253330123370e90010008b0991919b87001483c850dd6980c8009808001180800099803000a44103666f6f003322323253330133370e90010008a5eb7bdb1804c8dd5980d00098088011808800998048010009bab3300b300d00348020004dd7180a0009805a99980699b8748000c030008400854cc03924012a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163001001222533301000214c103d87a800013232323253330103371e00a002266e95200033015375000497ae01333007007003005375c60220066eb4c044008c05000cc048008c0040048894ccc038008530103d87a8000132323232533300e3371e00a002266e95200033013374c00497ae01333007007003005375c601e0066eacc03c008c04800cc040008cc00cc01400520023300330050014800130103d87a80004c0103d87980003300c3330073332323232223232533300f3375e006002266e1cc8c018004dd5998059806998059806802240009009240042940c050004c02cc94ccc038cdc3a4000601a00220022a6601e9212a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163322330070020013756660126016660126016004900024024660126016004900118008009129998078008a400026466e0120023300300300130120013001001222533300e00214c103d87a8000132323232533300e3375e00a002266e952000330130024bd7009998038038018029807801980780118090019808001000801260103d87a80004c0103d87980004bd700a4c2c6600200290001111199980399b8700100300d233330050053370000890011807800801001118031baa001230043754002ae695ce2ab9d5573caae7d5d02ba157441",
"hash": "a2021347cc09e6b75285dd60adf40232ae1fa92c1cd813760412444f"
},
{
"title": "withdrawals.spend",
@ -64,8 +64,8 @@
"$ref": "#/definitions/Void"
}
},
"compiledCode": "590270010000323232323232323232323222253330083233232001300100122533300e00114a226464a66601a0042660080080022940c048008cdc3a400460186ea8c040004004c8c8c8cc03cccc02cc8c94ccc034cdc3a40040022c2646466e1c0052054375a602600260160046016002660026eaccc01cc024cc01cc02401120004803130126d8799fd8799f581c22222222222222222222222222222222222222222222222222222222ffff004c0103d87a80004c0103d87980003300f33300b3232533300d3370e90010008b0991919b8700148070dd6980980098058011805800998009bab33007300933007300900448001200c4c126d8799fd87a9f581cafddc16c18e7d8de379fb9aad39b3d1b5afd27603e5ebac818432a72ffff004c0103d87a80004c0103d87980003300f33300b3375e6e9ccc8c88c008004c004004894ccc04000452f5c02646464646602a0026600c00c00660220066eb4c044008c050008c048004dd59980398049980398048022400090061ba73300f4c0126d8799fd8799f581c22222222222222222222222222222222222222222222222222222222ffff003300f4c126d8799fd87a9f581cafddc16c18e7d8de379fb9aad39b3d1b5afd27603e5ebac818432a72ffff004bd7026103d87a80004c0103d87980004bd701119801801000980080091129998070010a6103d87a8000132323232533300f3375e00a002266e95200033013375000497ae01333007007003005300f003375a601e004602400660200042930b19800800a40004444666600e66e1c00400c0308cccc014014cdc000224004601c0020040044600a6ea80048c00cdd5000ab9a5573aaae7955cfaba05742ae89",
"hash": "6ac5fd565071654c5fb6f069415e226dcfdbfed65b5b5ee6c9a05818"
"compiledCode": "59026e0100003232323232323232323232222533300832332300100122533300e00114a226464a66601a0042660080080022940c048008cdc3a400460186ea8c040004004c8c8c8cc03cccc02cc8c94ccc034cdc3a40040022c2646466e1c0052054375a602600260160046016002660026eaccc01cc024cc01cc024011200048031300126d8799fd8799f581c22222222222222222222222222222222222222222222222222222222ffff004c0103d87a80004c0103d87980003300f33300b3232533300d3370e90010008b0991919b8700148070dd6980980098058011805800998009bab33007300933007300900448001200c4c126d8799fd87a9f581cafddc16c18e7d8de379fb9aad39b3d1b5afd27603e5ebac818432a72ffff004c0103d87a80004c0103d87980003300f33300b3375e6e9ccc8c88c008004c004004894ccc04000452f5c02646464646602a0026600c00c00660220066eb4c044008c050008c048004dd59980398049980398048022400090061ba73300f4c0126d8799fd8799f581c22222222222222222222222222222222222222222222222222222222ffff003300f4c126d8799fd87a9f581cafddc16c18e7d8de379fb9aad39b3d1b5afd27603e5ebac818432a72ffff004bd7026103d87a80004c0103d87980004bd701119801801000980080091129998070010a6103d87a8000132323232533300f3375e00a002266e95200033013375000497ae01333007007003005300f003375a601e004602400660200042930b19800800a40004444666600e66e1c00400c0308cccc014014cdc000224004601c0020040044600a6ea80048c00cdd5000ab9a5573aaae7955cfaba05742ae89",
"hash": "4c1e29d1a38f1674004f2760ff0f124450b44238351640b9e5fe744f"
}
],
"definitions": {