Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #domain piece(P).
- #domain piece(P1).
- #domain piece(P2).
- #domain piece(P3).
- #domain piece(P4).
- #domain type(T).
- #domain direction(D).
- #domain direction(D1).
- #domain direction(D2).
- #domain direction(D2).
- direction(north;south;east;west).
- opposite(north,south).
- opposite(east,west).
- opposite(west,east).
- opposite(south,north).
- type(source).
- type(target).
- type(blocker).
- type(divider).
- { edge(P1,P2,D1) } :-
- P1 != P2,
- output_direction(P1,D1),
- input_direction(P2,D2),
- opposite(D1,D2).
- :- edge(P,P1,D), edge(P,P2,D), P1 < P2. % sufficient to check one side of ineq
- :- edge(P1,P,D), edge(P2,P,D), P1 < P2.
- edge(P1,P2) :- edge(P1,P2,D).
- :- edge(P1,P2), tag(P1,source), tag(P2,target).
- :- edge(P,P1), not laser_out(P).
- laser_out(P) :- tag(P,source).
- laser_out(P) :- tag(P,divider), laser_in(P).
- laser_in(P2) :- edge(P1,P2), laser_out(P1).
- :- tag(P,target), not laser_in(P).
- in_play(P) :- edge(P,_).
- in_play(P) :- edge(_,P).
- in_play(P) :- tag(P,source).
- in_play(P) :- tag(P,target).
- in_play(P) :- tag(P,blocker).
- fixed(P) :- at(P,X,Y).
- #domain split_count(S).
- split_count(1..3).
- divider_outs(P,S) :- tag(P,divider), S { output_direction(P,Di) :direction(Di) } S.
- #hide.
- #show edge/3.
Add Comment
Please, Sign In to add comment