Skip to content

Instantly share code, notes, and snippets.

@draftcode
Created December 16, 2011 06:44
Show Gist options
  • Select an option

  • Save draftcode/1484839 to your computer and use it in GitHub Desktop.

Select an option

Save draftcode/1484839 to your computer and use it in GitHub Desktop.
arc(a1, v1, v2).
arc(a2, v2, v3).
arc(a3, v3, v4).
arc(a4, v4, v1).
arc(a5, v3, v5).
walk(U, U).
walk(U, V) :- arc(_, U, U1), walk(U1, V).
path(U, U, _, []).
path(U, V, L, [A|P]) :-
arc(A, U, U1),
\+ member(U1, L),
path(U1, V, [U1|L], P).
path_find(U, V, P) :- path(U, V, [U], P).
mc_arc1(move(1,0), [1,M0,C0], [0,M,C]) :- M is M0-1, C is C0.
mc_arc1(move(0,1), [1,M0,C0], [0,M,C]) :- M is M0, C is C0-1.
mc_arc1(move(2,0), [1,M0,C0], [0,M,C]) :- M is M0-2, C is C0.
mc_arc1(move(0,2), [1,M0,C0], [0,M,C]) :- M is M0, C is C0-2.
mc_arc1(move(1,1), [1,M0,C0], [0,M,C]) :- M is M0-1, C is C0-1.
mc_arc1(back(1,0), [0,M0,C0], [1,M,C]) :- M is M0+1, C is C0.
mc_arc1(back(0,1), [0,M0,C0], [1,M,C]) :- M is M0, C is C0+1.
mc_arc1(back(2,0), [0,M0,C0], [1,M,C]) :- M is M0+2, C is C0.
mc_arc1(back(0,2), [0,M0,C0], [1,M,C]) :- M is M0, C is C0+2.
mc_arc1(back(1,1), [0,M0,C0], [1,M,C]) :- M is M0+1, C is C0+1.
mc_arc(Move, U, V) :-
mc_arc1(Move, U, V),
V = [_,M,C],
M >=0, C >=0,
not_eaten(M, C),
M1 is 3-M, C1 is 3-C,
M1 >=0, C1 >=0,
not_eaten(M1, C1).
not_eaten(0, _) :- !.
not_eaten(_, 0) :- !.
not_eaten(M, C) :- M >= C.
mc_puzzle(U, V, P) :- mc_puzzle(U, V, [U], P).
mc_puzzle(U, U, _, []).
mc_puzzle(U, V, L, [A|P]) :-
mc_arc(A, U, U1),
\+ member(U1, L),
mc_puzzle(U1, V, [U1|L], P).
part(N, 1, [N]).
part(N, M, [I|L]) :-
M >= 2,
I1 is N-M+1,
for(I, 1, I1),
N1 is N-I,
M1 is M-1,
part(N1, M1, L).
for(N, N, M) :- N =< M.
for(I, N, M) :- N =< M, N1 is N+1, for(I, N1, M).
eaten(state(1,1,_,0)) :- !.
eaten(state(_,1,1,0)) :- !.
eaten(state(0,0,_,1)) :- !.
eaten(state(_,0,0,1)) :- !.
graph1(move(1,0,0), state(0,G,C,0), state(1,G,C,1)).
graph1(move(0,1,0), state(W,0,C,0), state(W,1,C,1)).
graph1(move(0,0,1), state(W,G,0,0), state(W,G,1,1)).
graph1(move(0,0,0), state(W,G,C,0), state(W,G,C,1)).
graph1(back(1,0,0), state(1,G,C,1), state(0,G,C,0)).
graph1(back(0,1,0), state(W,1,C,1), state(W,0,C,0)).
graph1(back(0,0,1), state(W,G,1,1), state(W,G,0,0)).
graph1(back(0,0,0), state(W,G,C,1), state(W,G,C,0)).
graph(Move, U, V) :-
graph1(Move, U, V),
\+ eaten(U),
\+ eaten(V).
puzzle(U, V, P) :- puzzle(U, V, [U], P).
puzzle(U, U, _, []).
puzzle(U, V, L, [A|P]) :-
graph(A, U, U1),
\+ member(U1, L),
puzzle(U1, V, [U1|L], P).
% vim: ft=prolog
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment