import Ġjet brains . mps . logic . reactor . core . Reactor Lifecycle Ċ import Ġjet brains . mps . logic . reactor . evaluation . Evaluation Session Ċ import Ġjet brains . mps . logic . reactor . evaluation . Predicate Invocation Ċ import Ġjet brains . mps . logic . reactor . evaluation . Store View Ċ import Ġjet brains . mps . logic . reactor . logical . Logical Ċ import Ġjet brains . mps . logic . reactor . program . Constraint Ċ import Ġjet brains . mps . logic . reactor . program . Constraint Symbol Ċ import Ġorg . junit . After Class Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . BeforeClass Ċ import Ġorg . junit . Test Ċ import Ġprogram . Mock Constraint Ċ import Ġsolver . ask Equals Ċ import Ġsolver . tell Equals Ċ Ċ /** Ċ Ġ* Ġ@ author ĠF edor ĠIs ak ov Ċ Ġ*/ Ċ Ċ class ĠTest Program Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ BeforeClass ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe actor Lifecycle . init (); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ After Class ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġteardown () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe actor Lifecycle . de init (); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBuilder . session ( name : ĠString ): ĠStore View Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= ĠEvaluation Session . new Session ( program ( name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Parameter ( Evaluation Session . Parameter Key . of (" main ", ĠConstraint :: class . java ), ĠMock Constraint ( Constraint Symbol (" main ", Ġ 0 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start ( Mock Supervisor ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġsession . store View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > ĠPredicate Invocation . eq ( left : ĠT , Ġright : ĠT ) Ġ= Ġinvocation Context (). tell Equals ( left , Ġright ) ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > ĠPredicate Invocation . is _ eq ( left : ĠT , Ġright : ĠT ): ĠBoolean Ġ= Ġinvocation Context (). ask Equals ( left , Ġright ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreplace () Ġ{ ĊĠĠĠĠĠĠĠ Ġprogram With Rules ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" main ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" main ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" foo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" main . foo ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ke pt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" foo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" bar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). session (" replace "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( Constraint Symbol (" foo ", Ġ 0 ), ĠConstraint Symbol (" bar ", Ġ 0 )), Ġconstraint Symbols ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlogical Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( X , ĠY , ĠZ ) Ġ= Ġmeta Logical < Int >(" X ", Ġ" Y ", Ġ" Z ") ĊĠĠĠĠĠĠĠ Ġprogram With Rules ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" main ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" main ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement ({ Ġz Ġ-> Ġeq ( z , Ġ 3 3 ) Ġ}, ĠZ ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" foo ", ĠZ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" rule 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ke pt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" foo ", ĠX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement ({ Ġx , Ġy Ġ-> Ġeq ( y , Ġ( x . get () Ġ* Ġ 2 )) Ġ}, ĠX , ĠY ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" bar ", ĠY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). session (" logical Value "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( Constraint Symbol (" foo ", Ġ 1 ), ĠConstraint Symbol (" bar ", Ġ 1 )), Ġconstraint Symbols ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġall Occ urrences (). count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy val Ġ= Ġoccurrences ( Constraint Symbol (" bar ", Ġ 1 )). first (). arguments (). first () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 6 6 , Ġ( y val Ġas ĠLogical < Int >). get ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsimple Program () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( X , ĠY ) Ġ= Ġmeta Logical < Int >(" X ", Ġ" Y ") ĊĊĠĠĠĠĠĠĠ Ġprogram With Rules ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" main ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( constraint (" main ")), Ġbody ( statement ({ Ġx Ġ-> Ġx . set ( 5 ) Ġ}, ĠX ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" val ", ĠX )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" dec ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( constraint (" val ", ĠX )), Ġguard ( expression ({ Ġx Ġ-> Ġx . get () Ġ> Ġ 0 Ġ}, ĠX )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( constraint (" trail ", ĠX ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement ({ Ġx , Ġy Ġ-> Ġy . set ( x . get () Ġ- Ġ 1 ) Ġ}, ĠX , ĠY ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" val ", ĠY )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). session (" dec "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( Constraint Symbol (" val ", Ġ 1 ), ĠConstraint Symbol (" trail ", Ġ 1 )), Ġconstraint Symbols ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġoccurrences ( Constraint Symbol . symbol (" val ", Ġ 1 )). count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġoccurrences ( Constraint Symbol . symbol (" val ", Ġ 1 )). first (). arguments (). first () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġ( a Ġas ĠLogical < Int >). get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġoccurrences ( Constraint Symbol . symbol (" trail ", Ġ 1 )). count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgcd () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( M , ĠN , ĠTMP ) Ġ= Ġmeta Logical < Int >(" M ", Ġ" N ", Ġ" TMP ") ĊĠĠĠĠĠĠĠ Ġprogram With Rules ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" main ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( constraint (" main ")), Ġbody ( statement ({ Ġm , Ġn Ġ-> Ġm . set ( 2 1 ); Ġn . set ( 3 5 ) Ġ}, ĠM , ĠN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" gcd ", ĠM ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" gcd ", ĠN )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" trivial ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( constraint (" gcd ", ĠM )), Ġguard ( expression ({ Ġx Ġ-> Ġx . get () Ġ== Ġ 0 Ġ}, ĠM )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( statement Ġ{ Ġ} Ġ Ġ/* nothing */) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" step ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ke pt ( constraint (" gcd ", ĠN )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( constraint (" gcd ", ĠM )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguard ( expression ({ Ġm , Ġn Ġ-> Ġm . get () Ġ>= Ġn . get () Ġ}, ĠM , ĠN )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( statement ({ Ġm , Ġn , Ġtmp Ġ-> Ġtmp . set ( m . get () Ġ- Ġn . get ()) Ġ}, ĠM , ĠN , ĠTMP ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" gcd ", ĠTMP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). session (" gcd "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġall Occ urrences (). count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġall Occ urrences (). first (). arguments (). first () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 7 , Ġ( arg Ġas ĠLogical < Int >). get ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpri mes () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( M , ĠN ) Ġ= Ġmeta Logical < Int >(" M ", Ġ" N ") ĊĠĠĠĠĠĠĠ Ġprogram With Rules ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" main ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( constraint (" main ")), Ġbody ( statement ({ Ġn Ġ-> Ġn . set ( 1 0 ) Ġ}, ĠN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" prime ", ĠN )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" gen ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ke pt ( constraint (" prime ", ĠN )), Ġguard ( expression ({ Ġn Ġ-> Ġn . get () Ġ> Ġ 2 Ġ}, ĠN )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( statement ({ Ġm , Ġn Ġ-> Ġm . set ( n . get () Ġ- Ġ 1 ) Ġ}, ĠM , ĠN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint (" prime ", ĠM )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule (" s ift ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ke pt ( constraint (" prime ", ĠM )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Re placed ( constraint (" prime ", ĠN )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguard ( expression ({ Ġm , Ġn Ġ-> Ġ( n . get () Ġ% Ġm . get ()) Ġ== Ġ 0 Ġ}, ĠM , ĠN )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( statement Ġ{ Ġ} Ġ/* Ġnothing Ġ*/) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). session (" pri mes "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġall Occ urrences (). count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( 2 , Ġ 3 , Ġ 5 , Ġ 7 ), Ġoccurrences ( Constraint Symbol . symbol (" prime ", Ġ 1 )). flatMap Ġ{ Ġco Ġ-> Ġco . arguments () Ġ}. map Ġ{ Ġa Ġ-> Ġ( a Ġas ĠLogical < Int >). find Root (). value () Ġ}. toSet ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ