Skip to content

Instantly share code, notes, and snippets.

@jomontanari
Created May 1, 2012 02:50
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 jomontanari/2564609 to your computer and use it in GitHub Desktop.
Save jomontanari/2564609 to your computer and use it in GitHub Desktop.
Prolog Day 2
factorial(0, 1).
factorial(X, Y) :-
X > 0,
X1 is X - 1,
factorial(X1, Z),
Y is Z*X.
rev([], []).
rev([Head|Tail], Reversed) :-
rev(Tail, RevRest),
append(RevRest,[Head],Reversed).
smallest([X], X).
smallest([First,Second|Tail], Small) :-
First =< Second,
smallest([First|Tail], Small).
smallest([First,Second|Tail], Small) :-
First > Second,
smallest([Second|Tail], Small).
valid_queen([Row,Col]) :-
Range = [1,2,3,4,5,6,7,8],
member(Row, Range),
member(Col, Range).
validate_queens([]).
validate_queens([Head|Tail]) :-
valid_queen(Head),
validate_queens(Tail).
north_west_diags([], []).
north_west_diags([[Row,Col]|Tail], Diagonals) :-
Diag is Row - Col,
north_west_diags(Tail, RestOfDiagonals),
append(RestOfDiagonals,[Diag], Diagonals).
south_east_diags([],[]).
south_east_diags([[Row,Col]|Tail], Diagonals) :-
Diag is Row + Col,
south_east_diags(Tail, RestOfDiagonals),
append(RestOfDiagonals,[Diag], Diagonals).
queens(List) :-
length(List, 8),
validate_queens(List),
List = [[R1, C1], [R2, C2], [R3, C3], [R4, C4], [R5, C5], [R6, C6], [R7, C7], [R8, C8]],
Rows = [R1, R2, R3, R4, R5, R6, R7, R8],
Cols = [C1, C2, C3, C4, C5, C6, C7, C8],
fd_all_different(Rows),
fd_all_different(Cols),
north_west_diags(List, NorthWestDiags),
fd_all_different(NorthWestDiags),
south_east_diags(List, SouthEastDiags),
fd_all_different(SouthEastDiags).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment