machine('GardnerSwitchingPuzzle_v2').
'$setup_constants'(avl_set(node((fd(4,'TRACKS'),fd(3,'TRACKS')),true,0,node((fd(1,'TRACKS'),fd(2,'TRACKS')),true,1,empty,node((fd(2,'TRACKS'),fd(4,'TRACKS')),true,0,empty,empty)),node((fd(4,'TRACKS'),fd(5,'TRACKS')),true,1,empty,node((fd(5,'TRACKS'),fd(2,'TRACKS')),true,0,empty,empty)))),avl_set(node(((fd(4,'TRACKS'),fd(3,'TRACKS')),[]),true,0,node(((fd(1,'TRACKS'),fd(2,'TRACKS')),[]),true,1,empty,node(((fd(2,'TRACKS'),fd(4,'TRACKS')),avl_set(node(fd(2,'TRAINS'),true,1,empty,node(fd(3,'TRAINS'),true,0,empty,empty)))),true,0,empty,empty)),node(((fd(4,'TRACKS'),fd(5,'TRACKS')),[]),true,1,empty,node(((fd(5,'TRACKS'),fd(2,'TRACKS')),[]),true,0,empty,empty))))).
'$initialise_machine'(avl_set(node((fd(3,'TRACKS'),[]),true,0,node((fd(1,'TRACKS'),avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty))),true,1,empty,node((fd(2,'TRACKS'),avl_set(node((int(1),fd(2,'TRAINS')),true,0,empty,empty))),true,0,empty,empty)),node((fd(4,'TRACKS'),avl_set(node((int(1),fd(3,'TRAINS')),true,0,empty,empty))),true,1,empty,node((fd(5,'TRACKS'),[]),true,0,empty,empty))))).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(1,'TRACKS'),fd(2,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(1),fd(1,'TRAINS')),true,1,empty,node((int(2),fd(2,'TRAINS')),true,0,empty,empty))),fd(2,'TRACKS'),fd(5,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(1),fd(1,'TRAINS')),true,1,empty,node((int(2),fd(2,'TRAINS')),true,0,empty,empty))),fd(5,'TRACKS'),fd(4,'TRACKS'),[]).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,1,empty,node((int(2),fd(2,'TRAINS')),true,0,empty,empty))),fd(4,'TRACKS'),fd(3,'TRACKS'),avl_set(node((int(1),fd(3,'TRAINS')),true,0,empty,empty))).
'MoveRev'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(3,'TRACKS'),fd(4,'TRACKS'),avl_set(node((int(1),fd(2,'TRAINS')),true,0,empty,empty))).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(4,'TRACKS'),fd(5,'TRACKS'),avl_set(node((int(1),fd(3,'TRAINS')),true,0,empty,empty))).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(5,'TRACKS'),fd(2,'TRACKS'),[]).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(2,'TRACKS'),fd(4,'TRACKS'),[]).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,1,empty,node((int(2),fd(3,'TRAINS')),true,0,empty,empty))),fd(4,'TRACKS'),fd(3,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(2),fd(3,'TRAINS')),true,0,node((int(1),fd(1,'TRAINS')),true,0,empty,empty),node((int(3),fd(2,'TRAINS')),true,0,empty,empty))),fd(3,'TRACKS'),fd(4,'TRACKS'),[]).
'Move'(avl_set(node((int(2),fd(3,'TRAINS')),true,0,node((int(1),fd(1,'TRAINS')),true,0,empty,empty),node((int(3),fd(2,'TRAINS')),true,0,empty,empty))),fd(4,'TRACKS'),fd(5,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(1),fd(1,'TRAINS')),true,1,empty,node((int(2),fd(3,'TRAINS')),true,0,empty,empty))),fd(5,'TRACKS'),fd(4,'TRACKS'),avl_set(node((int(1),fd(2,'TRAINS')),true,0,empty,empty))).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,1,empty,node((int(2),fd(3,'TRAINS')),true,0,empty,empty))),fd(4,'TRACKS'),fd(3,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(3,'TRACKS'),fd(4,'TRACKS'),avl_set(node((int(1),fd(3,'TRAINS')),true,0,empty,empty))).
'MoveRev'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(4,'TRACKS'),fd(2,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(2,'TRACKS'),fd(5,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(1),fd(2,'TRAINS')),true,1,empty,node((int(2),fd(1,'TRAINS')),true,0,empty,empty))),fd(5,'TRACKS'),fd(4,'TRACKS'),[]).
'Move'(avl_set(node((int(1),fd(2,'TRAINS')),true,1,empty,node((int(2),fd(1,'TRAINS')),true,0,empty,empty))),fd(4,'TRACKS'),fd(3,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(2),fd(1,'TRAINS')),true,0,node((int(1),fd(2,'TRAINS')),true,0,empty,empty),node((int(3),fd(3,'TRAINS')),true,0,empty,empty))),fd(3,'TRACKS'),fd(4,'TRACKS'),[]).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,1,empty,node((int(2),fd(3,'TRAINS')),true,0,empty,empty))),fd(4,'TRACKS'),fd(5,'TRACKS'),avl_set(node((int(1),fd(2,'TRAINS')),true,0,empty,empty))).
'Move'(avl_set(node((int(1),fd(1,'TRAINS')),true,1,empty,node((int(2),fd(3,'TRAINS')),true,0,empty,empty))),fd(5,'TRACKS'),fd(2,'TRACKS'),[]).
'MoveRev'(avl_set(node((int(1),fd(1,'TRAINS')),true,0,empty,empty)),fd(2,'TRACKS'),fd(1,'TRACKS'),avl_set(node((int(1),fd(3,'TRAINS')),true,0,empty,empty))).

