Skip to content

Instantly share code, notes, and snippets.

@youxkei
Created September 17, 2023 05:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save youxkei/82294fc5dc404762bbd120824eb3cbad to your computer and use it in GitHub Desktop.
Save youxkei/82294fc5dc404762bbd120824eb3cbad to your computer and use it in GitHub Desktop.
N-Puzzle solver
ops(+).
ops(-).
ops(*).
ops(/).
calc([], [Result], Result).
calc([+ | Rest], [B, A | Stack], Result) :- calc(Rest, [A + B | Stack], Result).
calc([- | Rest], [B, A | Stack], Result) :- calc(Rest, [A - B | Stack], Result).
calc([- | Rest], [B, A | Stack], Result) :- calc(Rest, [B - A | Stack], Result).
calc([* | Rest], [B, A | Stack], Result) :- calc(Rest, [A * B | Stack], Result).
calc([/ | Rest], [B, A | Stack], Result) :- B > 0, calc(Rest, [A / B | Stack], Result).
calc([/ | Rest], [B, A | Stack], Result) :- A > 0, calc(Rest, [B / A | Stack], Result).
calc([N | Rest], Stack, Result) :- number(N), calc(Rest, [N | Stack], Result).
expr([N], 0, 0, Expr, [N | Expr]).
expr(Stack, Nums, Ops, Expr, Result) :-
Ops > 0,
ops(Op),
NextOps is Ops - 1,
expr(Stack, Nums, NextOps, [Op | Expr], Result).
expr([N , M | Stack], Nums, Ops, Expr, Result) :-
Nums > Ops,
NextNums is Nums - 1,
expr([M | Stack], NextNums, Ops, [N | Expr], Result).
solve_n_puzzle(N, Nums, Result) :-
length(Nums, Len),
Len > 0,
Size is Len - 1,
expr(Nums, Size, Size, [], Expr),
calc(Expr, [], Result),
Result =:= N.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment