-
Notifications
You must be signed in to change notification settings - Fork 0
/
PrologExample.txt
99 lines (82 loc) · 4.96 KB
/
PrologExample.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
all_different([]).
all_different([Head|Tail]) :- not(member(Head,Tail)), all_different(Tail).
all_between([]).
all_between([PuzzleH|PuzzleT]) :- between(1,9,PuzzleH), all_between(PuzzleT).
valid([]).
valid([ArrayH|ArrayT]) :- all_different(ArrayH), valid(ArrayT). //Makes sure every value is diff
solve(Puzzle,Solution) :-
Solution = Puzzle,
Puzzle = [P11,P12,P13,P14,P15,P16,P17,P18,P19,
P21,P22,P23,P24,P25,P26,P27,P28,P29,
P31,P32,P33,P34,P35,P36,P37,P38,P39,
P41,P42,P43,P44,P45,P46,P47,P48,P49,
P51,P52,P53,P54,P55,P56,P57,P58,P59, //variables to each slot
P61,P62,P63,P64,P65,P66,P67,P68,P69,
P71,P72,P73,P74,P75,P76,P77,P78,P79,
P81,P82,P83,P84,P85,P86,P87,P88,P89,
P91,P92,P93,P94,P95,P96,P97,P98,P99],
all_between(Solution), //checks if variables are between 1-9
Row1 = [P11,P12,P13,P14,P15,P16,P17,P18,P19],
Row2 = [P21,P22,P23,P24,P25,P26,P27,P28,P29],
Row3 = [P31,P32,P33,P34,P35,P36,P37,P38,P39],
Row4 = [P41,P42,P43,P44,P45,P46,P47,P48,P49],
Row5 = [P51,P52,P53,P54,P55,P56,P57,P58,P59],
Row6 = [P61,P62,P63,P64,P65,P66,P67,P68,P69],
Row7 = [P71,P72,P73,P74,P75,P76,P77,P78,P79],
Row8 = [P81,P82,P83,P84,P85,P86,P87,P88,P89],
Row9 = [P91,P92,P93,P94,P95,P96,P97,P98,P99],
Col1 = [P11,P21,P31,P41,P51,P61,P71,P81,P91],
Col2 = [P12,P22,P32,P42,P52,P62,P72,P82,P92],
Col3 = [P13,P23,P33,P43,P53,P63,P73,P83,P93],
Col4 = [P14,P24,P34,P44,P54,P64,P74,P84,P94],
Col5 = [P15,P25,P35,P45,P55,P65,P75,P85,P95],
Col6 = [P16,P26,P36,P46,P56,P66,P76,P86,P96],
Col7 = [P17,P27,P37,P47,P57,P67,P77,P87,P97],
Col8 = [P18,P28,P38,P48,P58,P68,P78,P88,P98],
Col9 = [P19,P29,P39,P49,P59,P69,P79,P89,P99],
Sq1 = [P11,P12,P13,P21,P22,P23,P31,P32,P33],
Sq2 = [P14,P15,P16,P24,P25,P26,P34,P35,P36],
Sq3 = [P17,P18,P19,P27,P28,P29,P37,P38,P39],
Sq4 = [P41,P42,P43,P51,P52,P53,P61,P62,P63],
Sq5 = [P44,P45,P46,P54,P55,P56,P64,P65,P66],
Sq6 = [P47,P48,P49,P57,P58,P59,P67,P68,P69],
Sq7 = [P71,P72,P73,P81,P82,P83,P91,P92,P93],
Sq8 = [P74,P75,P76,P84,P85,P86,P94,P95,P96],
Sq9 = [P77,P78,P79,P87,P88,P89,P97,P98,P99],
valid([Row1,Row2,Row3,Row4,Row5,Row6,Row7,Row8,Row9, //Only one of each
Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,
Sq1,Sq2,Sq3,Sq4,Sq5,Sq6,Sq7,Sq8,Sq9]).
Test Cases
?- solve([5, 3, _, _, 7, _, _, _, _,
| 6, _, _, 1, 9, 5, _, _, _,
| _, 9, 8, _, _, _, _, 6, _,
| 8, _, _, _, 6, _, _, _, 3,
| 4, _, _, 8, _, 3, _, _, 1,
| 7, _, _, _, 2, _, _, _, 6,
| _, 6, _, _, _, _, 2, 8, _,
| _, _, _, 4, 1, 9, _, _, 5,
| _, _, _, _, 8, _, _, 7, 9],
| Solution).
[5,3,4,6,7,8,9,1,2][6,7,2,1,9,5,3,4,8][1,9,8,3,4,2,5,6,7][8,5,9,7,6,1,4,2,3][4,2,6,8,5,3,7,9,1][7,1,3,9,2,4,8,5,6][9,6,1,5,3,7,2,8,4][2,8,7,4,1,9,6,3,5][3,4,5,2,8,6,1,7,9]
?-solve([_,8,9,4,_,7,5,_,_,
_,_,6,_,5,_,4,3,_,
3,_,4,2,8,_,_,_,1,
2,_,1,_,_,3,8,_,_,
6,_,_,9,4,_,_,_,3,
5,9,_,_,1,_,6,_,7,
_,1,7,5,_,_,_,_,_,
_,_,_,_,9,_,7,5,4,
_,3,_,_,6,8,_,2,9],Solution).
[5,9,1,3,6,4,7,2,8]
[7,8,3,5,9,2,1,6,4]
[6,2,4,7,1,8,5,3,9]
[9,6,8,4,7,3,2,5,1]
[4,7,2,6,5,1,8,9,3]
[1,3,5,8,2,9,4,7,6]
[2,4,7,9,8,6,3,1,5]
[8,1,9,2,3,5,6,4,7]
[3,5,6,1,4,7,9,8,2]
With help from
https://www.ybrikman.com/writing/2012/02/16/seven-languages-in-seven-weeks-prolog_16/
Explanation:
Prolog is a declarative programming language, and makes artificial intelligence and logical programming problems incredibly easy. For the Sudoku puzzle, all I had to do was essentially describe the problem to the language, and Prolog was able to find a solution to the problem. I told the system the starting puzzle configuration, the rules, including the all between 1-9 as well as all different in each row column and box, and Prolog was able to create a solution following the rules it was given. To solve this problem in a procedural programming language such as C++, the process would be much more difficult to explain to the language and it would have to go through a series of steps to complete the task. To solve the puzzle in C++, I’d imagine that I would have to run countless if statements and for loops to check that a number doesn’t already exist in a row, column, or box, and potentially having the program just guess what number to put into a box until it didn’t break any of the rules. Obviously for this specific task, Prolog has a very dominant victory. Prolog is made to define rules and facts about a program and make the language do the dirty work. C++ on the other hand, is made more for iterations and using functions. To implement this program in C++ would require a significant amount of work, because instead of just defining rules and telling the language to follow them, the programmer has to tell the language each rule as well as make sure the language follows them, essentially making the programmer do twice the work. I think C++ in general gives the user more control of how the program runs by allowing the user to have explicit references to how the environment runs, but Prolog sacrifices that control for ease of use.