diff --git a/src/main/jastadd/hanoi/MoveAlter.jadd b/src/main/jastadd/hanoi/MoveAlter.jadd new file mode 100644 index 0000000000000000000000000000000000000000..24c184fce7307299d6c36d1204b795eb74de422a --- /dev/null +++ b/src/main/jastadd/hanoi/MoveAlter.jadd @@ -0,0 +1,64 @@ +aspect MoveAlter{ + public boolean Constraint.oddTurnMoveAlter(Pillar P0, Pillar P1){ + /*for every odd turn(turn==true), move the smallest disk D0 in sequence. |-----------Right:DisksOnPillar(P0) + Therefore, ValidTarget checks for a move from P0 to P1, when D0 is on the top of P0. |------If():ComparFunction()------Left:ConstantNumM0(0) + Conjunction()-------------hasSmallestDisk()---------R0()-----------------F0()----------------|------Then():P0TopDiskSize() + | TopDiskSizeEq1 IfThenElse |------Else():ConstantNumM1(-1) + | | + | |----------ConstantNum1(1) + |---ValidTarget()---------R1()---------P1.ID() + P1EqTarget + | + |-----Mod0()------Left:Plus0()------Left:Plus1()------Left:Mod1()------TotalDiskAmount(); + | | | |------------ConstantNum2(2) + | | |--------ConstantNum1(1) + | |------P0.ID + |------ConstantNum3(3)*/ + + + + + TopDiskSize P0TopDiskSize=new TopDiskSize(P0); + ConstantNum NumM1=new ConstantNum(-1); + ConstantNum Num1=new ConstantNum(1); + ConstantNum Num0=new ConstantNum(0); + ConstantNum Num2=new ConstantNum(2); + ConstantNum Num3=new ConstantNum(3); + DisksOnPillar DisksOnP0=new DisksOnPillar(P0); + PillarID P0ID=new PillarID(P0); + PillarID P1ID=new PillarID(P1); + TotalDiskAmount DisksOverall=new TotalDiskAmount(P0);//return the number of disks set at the beginning + CompareFunction PillarHasDisk=new CompareFunction(Num0, DisksOnP0); + IfThenElse TopDiskChecher=new IfThenElse(PillarHasDisk, P0TopDiskSize, NumM1);//if the origin pillar + // is not emapty + //return the size of its top disk + //else return -1 means no such disk + Equal TopDiskSizeEq1= new Equal(TopDiskChecher, Num1);//the size of the disk on the top equals 1, + //indicates this is the smallest disk + Atom hasSmallestDisk=new Atom(TopDiskSizeEq1);//if the smallest disk is on this pillar + Mod Mod1=new Mod(DisksOverall, Num2);//check if we have odd or even disks in the game + Plus Plus1=new Plus(Mod1, Num1);//a intermediat parameter for calculating the target pillar in an odd turn + Plus Plus0=new Plus(Plus1, P0ID);//a parameter for calculating the target pillar in an odd turn + Mod Mod0=new Mod(Plus0, Num3);//calculating the target pillar in an odd turn + + Equal P1EqTarget= new Equal(P1ID, Mod0); + Atom ValidTarget=new Atom(P1EqTarget);//check if the move sequence from P0 to P1 is valid + + + + Conjunction ValidMove=new Conjunction(hasSmallestDisk, ValidTarget); + + + + + + this.addConnective(ValidMove); + if(this.getConnective(0).eval()){ + System.out.println("Odd turn: P" + P0.ID() +".hahasSmallestDisk0 && (P" + P0.ID() +".target == P" + P1.ID()+")"); + return true;//odd turn and valid move + }else{ + return false; + } + } + } +