playground/coq/unfinished/sudoku.v

819 lines
33 KiB
Coq

Require Import List.
Import ListNotations.
Search (list -> nat -> list).
Search (nat -> list -> list).
Search "take".
(*
Return the first n elements of the list l.
Return whatever is there if n > len(l).
*)
Fixpoint take (n : nat) (l : list nat) : list nat :=
match l, n with
| [], _ => []
| _, O => []
| (x::xs), S n' => (x :: take n' xs)
end.
Compute take 3 [1;2;3].
Compute take 2 [1;2;3].
Compute take 0 [1;2;3].
Compute take 1 [1;2;3].
Compute take 5 [1;2;3].
(* take ✓ *)
(* Consume first n elements of the list l, return the remaining elements as a list *)
Fixpoint jump (n : nat) (l : list nat) : list nat :=
match l, n with
| [], _ => []
| l', O => l'
| (_::xs), S n' => jump n' xs
end.
Compute jump 1 [1;2;3].
Compute jump 2 [1;2;3].
Compute jump 0 [1;2;3].
Compute jump 3 [1;2;3].
Compute jump 4 [1;2;3].
(* jump ✓ *)
(*
t: number of elements to take
s: number of elements to skip
n: number of iterations
l: grid
*)
Fixpoint take_n_jump (t s n : nat) (l : list nat) : list nat :=
match n with
| O => []
| S n' => (take t l) ++ (take_n_jump t s n' (jump (t+s) l))
end.
Compute take_n_jump 1 3 3 [1;2;3;4;5;6;7;8;9].
(* 1;5;9 *)
Compute take_n_jump 2 2 3 [1;2;3;4;5;6;7;8;9].
(* 1;2;5;6;9 *)
Compute take_n_jump 2 2 2 [1;2;3;4;5;6;7;8;9].
(* 1;2;5;6 *)
(*
Grid is stored as a list. Row major form.
A grid has size subrectangles.
Each subrectangle has h rows and w cols.
w
|
/-----+-----\
+-----------+-----------+-----------+
| Sub | Sub | Sub | ⎫
| rectangle | rectangle | rectangle | ⎬ h
| 1 | 2 | 3 | ⎭
+-----------+-----------+-----------+
| Sub | Sub | Sub |
| rectangle | rectangle | rectangle |
| 4 | 5 | 6 |
+-----------+-----------+-----------+
| Sub | Sub | Sub |
| rectangle | rectangle | rectangle |
| 7 | 8 | 9 |
+-----------+-----------+-----------+
For a 9x9 sudoku, h=3, w=3 so there will be 9 'subsquares'.
*)
(*
Variable h w : nat. (* height and width *)
*)
Definition h := 3.
Definition w := 3.
Definition size : nat := h * w. (* no of rows in a grid *)
(*
XXX: Can't we just say size = h * 3 ??
Suppose h,w = 2,3
size = 2 * 3 = 6 ✓
Suppose h,w = 5,2
size = 5 * 2 = 10
h*3 = 5 * 3 = 15
No, no.. I got it. The number of elements within a subrectangle should be same as the number of rows and number of columns.
But then why bother to say sub-'rectangle'? It would always be sub-square, right?
*)
(*
Get all elements of row i
i: row index (starts from zero)
l: grid.
*)
Definition row (i : nat) (l : list nat) : list nat := take size (jump (i * size) l).
(*
Get all elements of column i
i: column index (starts from zero)
l: grid.
*)
(* XXX: w was replaced by 3 *)
Definition col_aux (l : list nat) : list nat := take_n_jump 1 (size-1) size l.
Definition col (i : nat) (l : list nat) : list nat := col_aux (jump i l).
Definition rect_aux (l : list nat) : list nat := take_n_jump w (size-w) h l.
Require Import Arith. (* Notation _ / _ for nat division *)
Compute Nat.modulo 3 2.
Search Nat.modulo.
Definition rect (i : nat) (l : list nat) : list nat :=
rect_aux (jump ((Nat.div i h) * size * h + (Nat.modulo i w) * w) l).
Require Import Permutation.
(********* Permutation ************)
(* Coq standard library has an inductive type named Permutation to denote permutations:
https://coq.inria.fr/library/Coq.Sorting.Permutation.html
https://github.com/coq/coq/blob/master/theories/Sorting/Permutation.v
It looks something like:
#+begin_src coq
Inductive permutation {A : Type} : list A -> list A -> Prop :=
(* An empty list is a permutation of itself *)
| perm_nil : permutation [] []
(* If two lists are permutations of some list, they'll remain permutations
of some (another) list even upon adding a new element at their heads *)
| perm_same : forall (x : A) (l1 l2 : list A),
permutation l1 l2 -> permutation (x :: l1) (x :: l2)
(* The list formed by swapping the positions of the first two elements of a list
is a permutation of the original list *)
| perm_swap : forall (a b : A) (l : list A), (* swapping position *)
permutation (a :: b :: l) (b :: a :: l)
(* If two lists are permutations of some list and the second list is a permutation
of a third list, then the first and third lists are permutation of the same
list *)
| perm_trans : forall (l1 l2 l3 : list A),
permutation l1 l2 -> permutation l2 l3 -> permutation l1 l3.
#+end_src
*)
Compute Permutation [1;2] [2;1].
Compute Permutation [1;2] [2;1;3].
Compute Permutation [1;2] [2;1].
(*Check perm_skip 0 [1;2] [2;1].
Check perm_skip (Permutation [1;2] [2;1]) (Permutation [0;1;2] [0;2;1]). *)
(* Function to get all values from 1 to size *)
Fixpoint progression_aux (next z : nat) : list nat :=
match z with
| O => []
| S z' => next :: progression_aux (next+1) z'
end.
Definition progression (z : nat) : list nat := progression_aux 1 z.
Compute progression 10.
(**)
Example grid : list nat := take 81 (0 :: progression 81).
Compute take 3 grid.
Compute col 3 grid.
(* 3;12;21;30;39;48;57;66;75 *)
Compute rect 3 grid.
(* = [27; 28; 29; 36; 37; 38; 45; 46; 47] *)
(**)
Definition ref_list : list nat := progression size.
Definition sudoku (l : list nat) :=
(length l) = (size * size) /\
forall (i : nat), (i < size) -> Permutation (row i l) ref_list /\
forall (i : nat), (i < size) -> Permutation (col i l) ref_list /\
forall (i : nat), (i < size) -> Permutation (rect i l) ref_list.
(****************************************************************************************)
(* *)
(****************************************************************************************)
(* Position of cells in the grid. Indexing starts from zero *)
Inductive pos : Set :=
| Pos (x : nat) (y : nat).
(* valid_pos *)
(*
Definition is_valid_pos (p : pos) : Prop :=
let (x, y) := p in
(x < size) /\ (y < size).
*)
Definition is_valid_pos (p : pos) : Prop :=
match p with
| Pos x y => (x < size) /\ (y < size)
end.
Locate "_ == _".
Compute pred 3.
(* next. Doesn't check if the next position is valid in the grid. Just generates the next pos. c'est tout. *)
Search (nat -> nat -> bool).
Definition next_pos (p : pos) : pos :=
match p with
| Pos x y =>
if Nat.eqb y (size-1) then (* Nat.eqb notation is =? *)
(Pos (x+1) 0)
else
(Pos x (y+1))
end.
Compute next_pos (Pos 1 3).
Compute next_pos (Pos 1 8).
Compute next_pos (Pos 8 8).
(**)
(* pos2n *)
(* Convert a [pos] value to the corresponding [nat] index into the list representing the grid. *)
Definition pos_to_idx (p : pos) : nat :=
match p with
| Pos x y => x*size + y
end.
Compute pos_to_idx (Pos 3 1). (* 28 *)
Compute pos_to_idx (Pos 0 0). (* 0 *)
Compute pos_to_idx (Pos 8 8). (* 80 *)
(**)
(* Get value at a position of the grid *)
Definition get (p : pos) (l : list nat) : nat := List.nth 0 (jump (pos_to_idx p) l) 0. (* last 0 is the default value to be returned for List.nth *)
Compute get (Pos 8 8) grid. (* 80 *)
(**)
(*
Update a cell.
nval: new value
p: cell position
l: grid
Returns new value of grid
*)
Definition update (p : pos) (l : list nat) (nval : nat) : list nat :=
let idx := pos_to_idx p in
(take idx l) ++ [nval] ++ (jump (idx+1) l).
Compute update (Pos 3 1) grid 42.
(**)
(*
Literal type
Consists of a position and a value.
*)
Inductive literal : Set :=
| Literal (p : pos) (val : nat).
(* Clause is a conjunction of literals. ie, at least one of the constituent literals need be satisfied for the clause to be satisfied. *)
Definition clause : Set := list literal.
Search (bool -> bool -> bool).
Definition beq_pos (p1 p2 : pos) : bool :=
match p1, p2 with
| Pos x1 y1, Pos x2 y2 => andb (x1 =? x2) (y1 =? y2)
end.
Definition beq_literal (l1 l2 : literal) : bool :=
match l1, l2 with
| Literal p1 v1, Literal p2 v2 => andb (beq_pos p1 p2) (v1 =? v2)
end.
(* Checks whether a literal is in a clause *)
Fixpoint is_lit_in_clause (lit : literal) (c : clause) : bool :=
match c with
| [] => false
| x::xs =>
if (beq_literal x lit) then
true
else
is_lit_in_clause lit xs
end.
Example eg_clause := [Literal (Pos 1 2) 100; Literal (Pos 1 3) 200].
Compute is_lit_in_clause (Literal (Pos 1 3) 200) eg_clause. (* true *)
Compute is_lit_in_clause (Literal (Pos 4 3) 200) eg_clause. (* false *)
(**)
(* Insert a literal into a clause *)
(*Definition lit_insert (lit : literal) (c : clause) : clause := lit :: c.*)
Definition lit_insert (lit : literal) (c : clause) : clause :=
match (is_lit_in_clause lit c) with
| true => c
| _ => lit :: c
end.
Compute lit_insert (Literal (Pos 4 3) 200) eg_clause.
(*
c: a clause
cno: clause having literals that need to be removed from c
*)
Fixpoint lit_rm (c cno : clause) : clause :=
match c with
| [] => []
| (x::xs) =>
match (is_lit_in_clause x cno) with
| true => lit_rm xs cno
| false => x :: lit_rm xs cno
end
end.
Compute lit_rm eg_clause [Literal (Pos 1 3) 200].
Compute lit_rm eg_clause [Literal (Pos 4 3) 200].
(**)
(*
Merge c1 and c2.
*)
(*Definition clause_merge (c1 c2 : clause) : clause := c1 ++ c2.*)
Fixpoint clause_merge_aux (c1 c2 : clause) : clause :=
match c2 with
| [] => []
| (x::xs) =>
match (is_lit_in_clause x c1) with
| true => clause_merge_aux c1 xs
| false => x :: clause_merge_aux c1 xs
end
end.
Definition clause_merge (c1 c2 : clause) : clause := c1 ++ clause_merge_aux c1 c2.
Compute clause_merge [Literal (Pos 1 2) 10] [Literal (Pos 2 3) 20; Literal (Pos 3 4) 30].
Compute clause_merge [Literal (Pos 1 2) 10] [Literal (Pos 2 3) 20; Literal (Pos 1 2) 10].
(**)
(*
Conjunction of clauses. All clauses need to be satisfied.
the nat is the length of the clause. ie, number of literals making up the clause.
*)
Definition clauses := list (nat * clause).
Search (list _ -> _ -> bool).
(*
Check if an element is present inside a [nat] list.
*)
Fixpoint is_in (elem : nat) (l : list nat) : bool :=
match l with
| [] => false
| (x::xs) =>
if elem =? x then
true
else
is_in elem xs
end.
Compute progression_aux 0 3. (* 0;1;2 *)
(*
Insert a clause to a clauses (the latter is a list of clause values).
Assumes that [cs] is sorted in the ascending order of their [nat] values.
*)
Definition clauses_insert (c : clause) (cs : clauses) : clauses :=
match cs with
| [] => [(length c, c)]
| (x::xs) => (length c, c) :: cs
end.
(*
Remove from [cs] all clauses that contain the literal [l] and remove from each element (which is a [clause]) of [cs] all literals occurring in [c].
Used to update the list of constraints when a new fact ([l]) is known.
l: new fact that we knows to hold.
c: list of facts that we know doesn't hold.
*)
Fixpoint clauses_update (l : literal) (c : clause) (cs : clauses) : clauses :=
match cs with
| (_, x) :: xs =>
if (is_lit_in_clause l x) then
clauses_update l c xs
else
let res := (lit_rm c x) in
clauses_insert res (clauses_update l c xs)
| [] => []
end.
(* List of all possible indices *)
Definition indexes : list nat := progression_aux 0 size.
Compute indexes.
(* rect1cellids (renamed from cross) could thought of as all positions within the first sub-rectangle *)
Definition rect1cellids :=
let p := progression_aux 0 h in
let q := progression_aux 0 w in
fold_right (fun x l =>
(map (fun y => (Pos x y)) q) ++ l)
nil p.
Compute rect1cellids.
(*
(0,0), (0,1), (0,2),
(1,0), (1,1), (1,2),
(2,0), (2,1), (2,2),
*)
Compute indexes.
Compute ref_list.
Check lit_insert.
(* gridcellids (renamed from cross) could be thought of as all positions within the entire grid *)
Definition gridcellids := list_prod indexes indexes.
(* ORIG Version
Definition cross1 :=
fold_right (fun idx l =>
(map (fun val => (idx, val)) ref_list) ++ l) [] indexes.
*)
Compute gridcellids.
(*
= [(0, 0); (0, 1); (0, 2); (0, 3); (0, 4); (0, 5);
(0, 6); (0, 7); (0, 8); (1, 0); (1, 1); (1, 2);
(1, 3); (1, 4); (1, 5); (1, 6); (1, 7); (1, 8);
(2, 0); (2, 1); (2, 2); (2, 3); (2, 4); (2, 5);
(2, 6); (2, 7); (2, 8); (3, 0); (3, 1); (3, 2);
(3, 3); (3, 4); (3, 5); (3, 6); (3, 7); (3, 8);
(4, 0); (4, 1); (4, 2); (4, 3); (4, 4); (4, 5);
(4, 6); (4, 7); (4, 8); (5, 0); (5, 1); (5, 2);
(5, 3); (5, 4); (5, 5); (5, 6); (5, 7); (5, 8);
(6, 0); (6, 1); (6, 2); (6, 3); (6, 4); (6, 5);
(6, 6); (6, 7); (6, 8); (7, 0); (7, 1); (7, 2);
(7, 3); (7, 4); (7, 5); (7, 6); (7, 7); (7, 8);
(8, 0); (8, 1); (8, 2); (8, 3); (8, 4); (8, 5);
(8, 6); (8, 7); (8, 8)]
: list (nat * nat)
#+END_OUTPUT (Info) *)
Compute cross1.
(*
(0, 1); (0, 2); (0, 3); (0, 4); (0, 5); (0, 6); (0, 7); (0, 8); (0, 9);
(1, 1); (1, 2); (1, 3); (1, 4); (1, 5); (1, 6); (1, 7); (1, 8); (1, 9);
(2, 1); (2, 2); (2, 3); (2, 4); (2, 5); (2, 6); (2, 7); (2, 8); (2, 9);
(3, 1); (3, 2); (3, 3); (3, 4); (3, 5); (3, 6); (3, 7); (3, 8); (3, 9);
(4, 1); (4, 2); (4, 3); (4, 4); (4, 5); (4, 6); (4, 7); (4, 8); (4, 9);
(5, 1); (5, 2); (5, 3); (5, 4); (5, 5); (5, 6); (5, 7); (5, 8); (5, 9);
(6, 1); (6, 2); (6, 3); (6, 4); (6, 5); (6, 6); (6, 7); (6, 8); (6, 9);
(7, 1); (7, 2); (7, 3); (7, 4); (7, 5); (7, 6); (7, 7); (7, 8); (7, 9);
(8, 1); (8, 2); (8, 3); (8, 4); (8, 5); (8, 6); (8, 7); (8, 8); (8, 9)]
*)
(*
(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8)
(1,0), (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8)
(2,0), (2,1), (2,2), (2,3), (2,4), (2,5), (2,6), (2,7), (2,8)
(3,0), (3,1), (3,2), (3,3), (3,4), (3,5), (3,6), (3,7), (3,8)
(4,0), (4,1), (4,2), (4,3), (4,4), (4,5), (4,6), (4,7), (4,8)
(5,0), (5,1), (5,2), (5,3), (5,4), (5,5), (5,6), (5,7), (5,8)
(6,0), (6,1), (6,2), (6,3), (6,4), (6,5), (6,6), (6,7), (6,8)
(7,0), (7,1), (7,2), (7,3), (7,4), (7,5), (7,6), (7,7), (7,8)
(8,0), (8,1), (8,2), (8,3), (8,4), (8,5), (8,6), (8,7), (8,8)
*)
Check fold_right.
(*
forall A B : Type, (B -> A -> A) -> A -> list B -> A
*)
Compute fold_right (fun x acc=>x::acc) [] [1;2]%list.
(* Okay, fold_right is like
fold_right f acc lst.
where f takes a value from lst and the accumulator.
fold_right finally returns the final value of accumulator.
*)
(* generate constraints saying that row i has value val *)
Definition gen_row (i val:nat) :=
fold_right
(fun idx acc =>
(lit_insert (Literal (Pos i idx) val) acc))
[] indexes.
(* val are elements of indexes
l is the accumulator whose initial value is [] *)
Compute gen_row 2 0.
(* generate constraints saying that column i has value val *)
Definition gen_column (i val:nat) :=
fold_right
(fun idx acc =>
(lit_insert (Literal (Pos idx i) val) acc))
[] indexes.
Compute gen_column 2 0.
Compute list_prod [1;2] [3;4].
Compute progression_aux 0 3.
Compute progression_aux 3 3.
Search (list _ -> list _ -> list _).
Search (nat -> nat -> nat).
Compute Nat.modulo 3 2.
Compute
(fun xy:nat*nat =>
let '(x,y) := xy in
Literal (Pos x y) 3) (4,5).
(* generate constraints saying that subrectangle i has value val *)
Definition gen_rect (i val:nat) :=
let xs := progression_aux ((Nat.div i 3)*w) 3 in
let ys := progression_aux ((Nat.modulo i 3)*w) 3 in
let xys := list_prod xs ys in
map (fun xy:nat*nat =>
let '(x,y) := xy in
Literal (Pos x y) val)
xys.
Compute gen_rect 5 0.
(*
= [Literal (Pos 3 6) 0; Literal (Pos 3 7) 0;
Literal (Pos 3 8) 0; Literal (Pos 4 6) 0; Literal (Pos 4 7) 0;
Literal (Pos 4 8) 0; Literal (Pos 5 6) 0; Literal (Pos 5 7) 0;
Literal (Pos 5 8) 0]
: list literal
*)
(* Generate constraint saying that the cell at a given position is not empty. ie, not zero as per our convention. *)
Definition gen_cell (p:pos) :=
fold_right
(fun val acc => lit_insert (Literal p val) acc)
[] ref_list.
Compute gen_cell (Pos 2 1).
(*
= [Literal (Pos 2 1) 1; Literal (Pos 2 1) 2;
Literal (Pos 2 1) 3; Literal (Pos 2 1) 4; Literal (Pos 2 1) 5;
Literal (Pos 2 1) 6; Literal (Pos 2 1) 7; Literal (Pos 2 1) 8;
Literal (Pos 2 1) 9]
: clause
*)
(* Generate constraints saying that all cells are non-empty *)
Definition all_cells :=
let cellids := list_prod indexes indexes in
fold_right
(fun cellid acc =>
let '(x,y) := cellid in
(gen_cell (Pos x y)) ++ acc)
[] cellids.
Compute all_cells.
(*
= [Literal (Pos 0 0) 1; Literal (Pos 0 0) 2;
Literal (Pos 0 0) 3; Literal (Pos 0 0) 4; Literal (Pos 0 0) 5;
Literal (Pos 0 0) 6; Literal (Pos 0 0) 7; Literal (Pos 0 0) 8;
Literal (Pos 0 0) 9; Literal (Pos 0 1) 1; Literal (Pos 0 1) 2;
Literal (Pos 0 1) 3; Literal (Pos 0 1) 4; Literal (Pos 0 1) 5;
Literal (Pos 0 1) 6; Literal (Pos 0 1) 7; Literal (Pos 0 1) 8;
Literal (Pos 0 1) 9; Literal (Pos 0 2) 1; Literal (Pos 0 2) 2;
Literal (Pos 0 2) 3; Literal (Pos 0 2) 4; Literal (Pos 0 2) 5;
Literal (Pos 0 2) 6; Literal (Pos 0 2) 7; Literal (Pos 0 2) 8;
Literal (Pos 0 2) 9; Literal (Pos 0 3) 1; Literal (Pos 0 3) 2;
Literal (Pos 0 3) 3; Literal (Pos 0 3) 4; Literal (Pos 0 3) 5;
Literal (Pos 0 3) 6; Literal (Pos 0 3) 7; Literal (Pos 0 3) 8;
Literal (Pos 0 3) 9; Literal (Pos 0 4) 1; Literal (Pos 0 4) 2;
Literal (Pos 0 4) 3; Literal (Pos 0 4) 4; Literal (Pos 0 4) 5;
Literal (Pos 0 4) 6; Literal (Pos 0 4) 7; Literal (Pos 0 4) 8;
Literal (Pos 0 4) 9; Literal (Pos 0 5) 1; Literal (Pos 0 5) 2;
Literal (Pos 0 5) 3; Literal (Pos 0 5) 4; Literal (Pos 0 5) 5;
Literal (Pos 0 5) 6; Literal (Pos 0 5) 7; Literal (Pos 0 5) 8;
Literal (Pos 0 5) 9; Literal (Pos 0 6) 1; Literal (Pos 0 6) 2;
Literal (Pos 0 6) 3; Literal (Pos 0 6) 4; Literal (Pos 0 6) 5;
Literal (Pos 0 6) 6; Literal (Pos 0 6) 7; Literal (Pos 0 6) 8;
Literal (Pos 0 6) 9; Literal (Pos 0 7) 1; Literal (Pos 0 7) 2;
Literal (Pos 0 7) 3; Literal (Pos 0 7) 4; Literal (Pos 0 7) 5;
Literal (Pos 0 7) 6; Literal (Pos 0 7) 7; Literal (Pos 0 7) 8;
Literal (Pos 0 7) 9; Literal (Pos 0 8) 1; Literal (Pos 0 8) 2;
Literal (Pos 0 8) 3; Literal (Pos 0 8) 4; Literal (Pos 0 8) 5;
Literal (Pos 0 8) 6; Literal (Pos 0 8) 7; Literal (Pos 0 8) 8;
Literal (Pos 0 8) 9; Literal (Pos 1 0) 1; Literal (Pos 1 0) 2;
Literal (Pos 1 0) 3; Literal (Pos 1 0) 4; Literal (Pos 1 0) 5;
Literal (Pos 1 0) 6; Literal (Pos 1 0) 7; Literal (Pos 1 0) 8;
Literal (Pos 1 0) 9; Literal (Pos 1 1) 1; Literal (Pos 1 1) 2;
Literal (Pos 1 1) 3; Literal (Pos 1 1) 4; Literal (Pos 1 1) 5;
Literal (Pos 1 1) 6; Literal (Pos 1 1) 7; Literal (Pos 1 1) 8;
Literal (Pos 1 1) 9; Literal (Pos 1 2) 1; Literal (Pos 1 2) 2;
Literal (Pos 1 2) 3; Literal (Pos 1 2) 4; Literal (Pos 1 2) 5;
Literal (Pos 1 2) 6; Literal (Pos 1 2) 7; Literal (Pos 1 2) 8;
Literal (Pos 1 2) 9; Literal (Pos 1 3) 1; Literal (Pos 1 3) 2;
Literal (Pos 1 3) 3; Literal (Pos 1 3) 4; Literal (Pos 1 3) 5;
Literal (Pos 1 3) 6; Literal (Pos 1 3) 7; Literal (Pos 1 3) 8;
Literal (Pos 1 3) 9; Literal (Pos 1 4) 1; Literal (Pos 1 4) 2;
Literal (Pos 1 4) 3; Literal (Pos 1 4) 4; Literal (Pos 1 4) 5;
Literal (Pos 1 4) 6; Literal (Pos 1 4) 7; Literal (Pos 1 4) 8;
Literal (Pos 1 4) 9; Literal (Pos 1 5) 1; Literal (Pos 1 5) 2;
Literal (Pos 1 5) 3; Literal (Pos 1 5) 4; Literal (Pos 1 5) 5;
Literal (Pos 1 5) 6; Literal (Pos 1 5) 7; Literal (Pos 1 5) 8;
Literal (Pos 1 5) 9; Literal (Pos 1 6) 1; Literal (Pos 1 6) 2;
Literal (Pos 1 6) 3; Literal (Pos 1 6) 4; Literal (Pos 1 6) 5;
Literal (Pos 1 6) 6; Literal (Pos 1 6) 7; Literal (Pos 1 6) 8;
Literal (Pos 1 6) 9; Literal (Pos 1 7) 1; Literal (Pos 1 7) 2;
Literal (Pos 1 7) 3; Literal (Pos 1 7) 4; Literal (Pos 1 7) 5;
Literal (Pos 1 7) 6; Literal (Pos 1 7) 7; Literal (Pos 1 7) 8;
Literal (Pos 1 7) 9; Literal (Pos 1 8) 1; Literal (Pos 1 8) 2;
Literal (Pos 1 8) 3; Literal (Pos 1 8) 4; Literal (Pos 1 8) 5;
Literal (Pos 1 8) 6; Literal (Pos 1 8) 7; Literal (Pos 1 8) 8;
Literal (Pos 1 8) 9; Literal (Pos 2 0) 1; Literal (Pos 2 0) 2;
Literal (Pos 2 0) 3; Literal (Pos 2 0) 4; Literal (Pos 2 0) 5;
Literal (Pos 2 0) 6; Literal (Pos 2 0) 7; Literal (Pos 2 0) 8;
Literal (Pos 2 0) 9; Literal (Pos 2 1) 1; Literal (Pos 2 1) 2;
Literal (Pos 2 1) 3; Literal (Pos 2 1) 4; Literal (Pos 2 1) 5;
Literal (Pos 2 1) 6; Literal (Pos 2 1) 7; Literal (Pos 2 1) 8;
Literal (Pos 2 1) 9; Literal (Pos 2 2) 1; Literal (Pos 2 2) 2;
Literal (Pos 2 2) 3; Literal (Pos 2 2) 4; Literal (Pos 2 2) 5;
Literal (Pos 2 2) 6; Literal (Pos 2 2) 7; Literal (Pos 2 2) 8;
Literal (Pos 2 2) 9; Literal (Pos 2 3) 1; Literal (Pos 2 3) 2;
Literal (Pos 2 3) 3; Literal (Pos 2 3) 4; Literal (Pos 2 3) 5;
Literal (Pos 2 3) 6; Literal (Pos 2 3) 7; Literal (Pos 2 3) 8;
Literal (Pos 2 3) 9; Literal (Pos 2 4) 1; Literal (Pos 2 4) 2;
Literal (Pos 2 4) 3; Literal (Pos 2 4) 4; Literal (Pos 2 4) 5;
Literal (Pos 2 4) 6; Literal (Pos 2 4) 7; Literal (Pos 2 4) 8;
Literal (Pos 2 4) 9; Literal (Pos 2 5) 1; Literal (Pos 2 5) 2;
Literal (Pos 2 5) 3; Literal (Pos 2 5) 4; Literal (Pos 2 5) 5;
Literal (Pos 2 5) 6; Literal (Pos 2 5) 7; Literal (Pos 2 5) 8;
Literal (Pos 2 5) 9; Literal (Pos 2 6) 1; Literal (Pos 2 6) 2;
Literal (Pos 2 6) 3; Literal (Pos 2 6) 4; Literal (Pos 2 6) 5;
Literal (Pos 2 6) 6; Literal (Pos 2 6) 7; Literal (Pos 2 6) 8;
Literal (Pos 2 6) 9; Literal (Pos 2 7) 1; Literal (Pos 2 7) 2;
Literal (Pos 2 7) 3; Literal (Pos 2 7) 4; Literal (Pos 2 7) 5;
Literal (Pos 2 7) 6; Literal (Pos 2 7) 7; Literal (Pos 2 7) 8;
Literal (Pos 2 7) 9; Literal (Pos 2 8) 1; Literal (Pos 2 8) 2;
Literal (Pos 2 8) 3; Literal (Pos 2 8) 4; Literal (Pos 2 8) 5;
Literal (Pos 2 8) 6; Literal (Pos 2 8) 7; Literal (Pos 2 8) 8;
Literal (Pos 2 8) 9; Literal (Pos 3 0) 1; Literal (Pos 3 0) 2;
Literal (Pos 3 0) 3; Literal (Pos 3 0) 4; Literal (Pos 3 0) 5;
Literal (Pos 3 0) 6; Literal (Pos 3 0) 7; Literal (Pos 3 0) 8;
Literal (Pos 3 0) 9; Literal (Pos 3 1) 1; Literal (Pos 3 1) 2;
Literal (Pos 3 1) 3; Literal (Pos 3 1) 4; Literal (Pos 3 1) 5;
Literal (Pos 3 1) 6; Literal (Pos 3 1) 7; Literal (Pos 3 1) 8;
Literal (Pos 3 1) 9; Literal (Pos 3 2) 1; Literal (Pos 3 2) 2;
Literal (Pos 3 2) 3; Literal (Pos 3 2) 4; Literal (Pos 3 2) 5;
Literal (Pos 3 2) 6; Literal (Pos 3 2) 7; Literal (Pos 3 2) 8;
Literal (Pos 3 2) 9; Literal (Pos 3 3) 1; Literal (Pos 3 3) 2;
Literal (Pos 3 3) 3; Literal (Pos 3 3) 4; Literal (Pos 3 3) 5;
Literal (Pos 3 3) 6; Literal (Pos 3 3) 7; Literal (Pos 3 3) 8;
Literal (Pos 3 3) 9; Literal (Pos 3 4) 1; Literal (Pos 3 4) 2;
Literal (Pos 3 4) 3; Literal (Pos 3 4) 4; Literal (Pos 3 4) 5;
Literal (Pos 3 4) 6; Literal (Pos 3 4) 7; Literal (Pos 3 4) 8;
Literal (Pos 3 4) 9; Literal (Pos 3 5) 1; Literal (Pos 3 5) 2;
Literal (Pos 3 5) 3; Literal (Pos 3 5) 4; Literal (Pos 3 5) 5;
Literal (Pos 3 5) 6; Literal (Pos 3 5) 7; Literal (Pos 3 5) 8;
Literal (Pos 3 5) 9; Literal (Pos 3 6) 1; Literal (Pos 3 6) 2;
Literal (Pos 3 6) 3; Literal (Pos 3 6) 4; Literal (Pos 3 6) 5;
Literal (Pos 3 6) 6; Literal (Pos 3 6) 7; Literal (Pos 3 6) 8;
Literal (Pos 3 6) 9; Literal (Pos 3 7) 1; Literal (Pos 3 7) 2;
Literal (Pos 3 7) 3; Literal (Pos 3 7) 4; Literal (Pos 3 7) 5;
Literal (Pos 3 7) 6; Literal (Pos 3 7) 7; Literal (Pos 3 7) 8;
Literal (Pos 3 7) 9; Literal (Pos 3 8) 1; Literal (Pos 3 8) 2;
Literal (Pos 3 8) 3; Literal (Pos 3 8) 4; Literal (Pos 3 8) 5;
Literal (Pos 3 8) 6; Literal (Pos 3 8) 7; Literal (Pos 3 8) 8;
Literal (Pos 3 8) 9; Literal (Pos 4 0) 1; Literal (Pos 4 0) 2;
Literal (Pos 4 0) 3; Literal (Pos 4 0) 4; Literal (Pos 4 0) 5;
Literal (Pos 4 0) 6; Literal (Pos 4 0) 7; Literal (Pos 4 0) 8;
Literal (Pos 4 0) 9; Literal (Pos 4 1) 1; Literal (Pos 4 1) 2;
Literal (Pos 4 1) 3; Literal (Pos 4 1) 4; Literal (Pos 4 1) 5;
Literal (Pos 4 1) 6; Literal (Pos 4 1) 7; Literal (Pos 4 1) 8;
Literal (Pos 4 1) 9; Literal (Pos 4 2) 1; Literal (Pos 4 2) 2;
Literal (Pos 4 2) 3; Literal (Pos 4 2) 4; Literal (Pos 4 2) 5;
Literal (Pos 4 2) 6; Literal (Pos 4 2) 7; Literal (Pos 4 2) 8;
Literal (Pos 4 2) 9; Literal (Pos 4 3) 1; Literal (Pos 4 3) 2;
Literal (Pos 4 3) 3; Literal (Pos 4 3) 4; Literal (Pos 4 3) 5;
Literal (Pos 4 3) 6; Literal (Pos 4 3) 7; Literal (Pos 4 3) 8;
Literal (Pos 4 3) 9; Literal (Pos 4 4) 1; Literal (Pos 4 4) 2;
Literal (Pos 4 4) 3; Literal (Pos 4 4) 4; Literal (Pos 4 4) 5;
Literal (Pos 4 4) 6; Literal (Pos 4 4) 7; Literal (Pos 4 4) 8;
Literal (Pos 4 4) 9; Literal (Pos 4 5) 1; Literal (Pos 4 5) 2;
Literal (Pos 4 5) 3; Literal (Pos 4 5) 4; Literal (Pos 4 5) 5;
Literal (Pos 4 5) 6; Literal (Pos 4 5) 7; Literal (Pos 4 5) 8;
Literal (Pos 4 5) 9; Literal (Pos 4 6) 1; Literal (Pos 4 6) 2;
Literal (Pos 4 6) 3; Literal (Pos 4 6) 4; Literal (Pos 4 6) 5;
Literal (Pos 4 6) 6; Literal (Pos 4 6) 7; Literal (Pos 4 6) 8;
Literal (Pos 4 6) 9; Literal (Pos 4 7) 1; Literal (Pos 4 7) 2;
Literal (Pos 4 7) 3; Literal (Pos 4 7) 4; Literal (Pos 4 7) 5;
Literal (Pos 4 7) 6; Literal (Pos 4 7) 7; Literal (Pos 4 7) 8;
Literal (Pos 4 7) 9; Literal (Pos 4 8) 1; Literal (Pos 4 8) 2;
Literal (Pos 4 8) 3; Literal (Pos 4 8) 4; Literal (Pos 4 8) 5;
Literal (Pos 4 8) 6; Literal (Pos 4 8) 7; Literal (Pos 4 8) 8;
Literal (Pos 4 8) 9; Literal (Pos 5 0) 1; Literal (Pos 5 0) 2;
Literal (Pos 5 0) 3; Literal (Pos 5 0) 4; Literal (Pos 5 0) 5;
Literal (Pos 5 0) 6; Literal (Pos 5 0) 7; Literal (Pos 5 0) 8;
Literal (Pos 5 0) 9; Literal (Pos 5 1) 1; Literal (Pos 5 1) 2;
Literal (Pos 5 1) 3; Literal (Pos 5 1) 4; Literal (Pos 5 1) 5;
Literal (Pos 5 1) 6; Literal (Pos 5 1) 7; Literal (Pos 5 1) 8;
Literal (Pos 5 1) 9; Literal (Pos 5 2) 1; Literal (Pos 5 2) 2;
Literal (Pos 5 2) 3; Literal (Pos 5 2) 4; Literal (Pos 5 2) 5;
Literal (Pos 5 2) 6; Literal (Pos 5 2) 7; Literal (Pos 5 2) 8;
Literal (Pos 5 2) 9; Literal (Pos 5 3) 1; Literal (Pos 5 3) 2;
Literal (Pos 5 3) 3; Literal (Pos 5 3) 4; Literal (Pos 5 3) 5;
Literal (Pos 5 3) 6; Literal (Pos 5 3) 7; Literal (Pos 5 3) 8;
Literal (Pos 5 3) 9; Literal (Pos 5 4) 1; Literal (Pos 5 4) 2;
Literal (Pos 5 4) 3; Literal (Pos 5 4) 4; Literal (Pos 5 4) 5;
Literal (Pos 5 4) 6; Literal (Pos 5 4) 7; Literal (Pos 5 4) 8;
Literal (Pos 5 4) 9; Literal (Pos 5 5) 1; Literal (Pos 5 5) 2;
Literal (Pos 5 5) 3; Literal (Pos 5 5) 4; Literal (Pos 5 5) 5;
Literal (Pos 5 5) 6; Literal (Pos 5 5) 7; Literal (Pos 5 5) 8;
Literal (Pos 5 5) 9; Literal (Pos 5 6) 1; Literal (Pos 5 6) 2;
Literal (Pos 5 6) 3; Literal (Pos 5 6) 4; Literal (Pos 5 6) 5;
Literal (Pos 5 6) 6; Literal (Pos 5 6) 7; Literal (Pos 5 6) 8;
Literal (Pos 5 6) 9; Literal (Pos 5 7) 1; Literal (Pos 5 7) 2;
Literal (Pos 5 7) 3; Literal (Pos 5 7) 4; Literal (Pos 5 7) 5;
Literal (Pos 5 7) 6; Literal (Pos 5 7) 7; Literal (Pos 5 7) 8;
Literal (Pos 5 7) 9; Literal (Pos 5 8) 1; Literal (Pos 5 8) 2;
Literal (Pos 5 8) 3; Literal (Pos 5 8) 4; Literal (Pos 5 8) 5;
Literal (Pos 5 8) 6; Literal (Pos 5 8) 7; Literal (Pos 5 8) 8;
Literal (Pos 5 8) 9; Literal (Pos 6 0) 1; Literal (Pos 6 0) 2;
Literal (Pos 6 0) 3; Literal (Pos 6 0) 4; Literal (Pos 6 0) 5;
Literal (Pos 6 0) 6; Literal (Pos 6 0) 7; Literal (Pos 6 0) 8;
Literal (Pos 6 0) 9; Literal (Pos 6 1) 1; Literal (Pos 6 1) 2;
Literal (Pos 6 1) 3; Literal (Pos 6 1) 4; Literal (Pos 6 1) 5;
Literal (Pos 6 1) 6; Literal (Pos 6 1) 7; Literal (Pos 6 1) 8;
Literal (Pos 6 1) 9; Literal (Pos 6 2) 1; Literal (Pos 6 2) 2;
Literal (Pos 6 2) 3; Literal (Pos 6 2) 4; Literal (Pos 6 2) 5;
Literal (Pos 6 2) 6; Literal (Pos 6 2) 7; Literal (Pos 6 2) 8;
Literal (Pos 6 2) 9; Literal (Pos 6 3) 1; Literal (Pos 6 3) 2;
Literal (Pos 6 3) 3; Literal (Pos 6 3) 4; Literal (Pos 6 3) 5;
Literal (Pos 6 3) 6; Literal (Pos 6 3) 7; Literal (Pos 6 3) 8;
Literal (Pos 6 3) 9; Literal (Pos 6 4) 1; Literal (Pos 6 4) 2;
Literal (Pos 6 4) 3; Literal (Pos 6 4) 4; Literal (Pos 6 4) 5;
Literal (Pos 6 4) 6; Literal (Pos 6 4) 7; Literal (Pos 6 4) 8;
Literal (Pos 6 4) 9; Literal (Pos 6 5) 1; Literal (Pos 6 5) 2;
Literal (Pos 6 5) 3; Literal (Pos 6 5) 4; Literal (Pos 6 5) 5;
Literal (Pos 6 5) 6; Literal (Pos 6 5) 7; Literal (Pos 6 5) 8;
Literal (Pos 6 5) 9; Literal (Pos 6 6) 1; Literal (Pos 6 6) 2;
Literal (Pos 6 6) 3; Literal (Pos 6 6) 4; Literal (Pos 6 6) 5;
Literal (Pos 6 6) 6; Literal (Pos 6 6) 7; Literal (Pos 6 6) 8;
Literal (Pos 6 6) 9; Literal (Pos 6 7) 1; Literal (Pos 6 7) 2;
Literal (Pos 6 7) 3; Literal (Pos 6 7) 4; Literal (Pos 6 7) 5;
Literal (Pos 6 7) 6; Literal (Pos 6 7) 7; Literal (Pos 6 7) 8;
Literal (Pos 6 7) 9; Literal (Pos 6 8) 1; Literal (Pos 6 8) 2;
Literal (Pos 6 8) 3; Literal (Pos 6 8) 4; Literal (Pos 6 8) 5;
Literal (Pos 6 8) 6; Literal (Pos 6 8) 7; Literal (Pos 6 8) 8;
Literal (Pos 6 8) 9; Literal (Pos 7 0) 1; Literal (Pos 7 0) 2;
Literal (Pos 7 0) 3; Literal (Pos 7 0) 4; Literal (Pos 7 0) 5;
Literal (Pos 7 0) 6; Literal (Pos 7 0) 7; Literal (Pos 7 0) 8;
Literal (Pos 7 0) 9; Literal (Pos 7 1) 1; Literal (Pos 7 1) 2;
Literal (Pos 7 1) 3; Literal (Pos 7 1) 4; Literal (Pos 7 1) 5;
Literal (Pos 7 1) 6; Literal (Pos 7 1) 7; Literal (Pos 7 1) 8;
Literal (Pos 7 1) 9; Literal (Pos 7 2) 1; Literal (Pos 7 2) 2;
Literal (Pos 7 2) 3; Literal (Pos 7 2) 4; Literal (Pos 7 2) 5;
Literal (Pos 7 2) 6; Literal (Pos 7 2) 7; Literal (Pos 7 2) 8;
Literal (Pos 7 2) 9; Literal (Pos 7 3) 1; Literal (Pos 7 3) 2;
Literal (Pos 7 3) 3; Literal (Pos 7 3) 4; Literal (Pos 7 3) 5;
Literal (Pos 7 3) 6; Literal (Pos 7 3) 7; Literal (Pos 7 3) 8;
Literal (Pos 7 3) 9; Literal (Pos 7 4) 1; Literal (Pos 7 4) 2;
Literal (Pos 7 4) 3; Literal (Pos 7 4) 4; Literal (Pos 7 4) 5;
Literal (Pos 7 4) 6; Literal (Pos 7 4) 7; Literal (Pos 7 4) 8;
Literal (Pos 7 4) 9; Literal (Pos 7 5) 1; Literal (Pos 7 5) 2;
Literal (Pos 7 5) 3; Literal (Pos 7 5) 4; Literal (Pos 7 5) 5;
Literal (Pos 7 5) 6; Literal (Pos 7 5) 7; Literal (Pos 7 5) 8;
Literal (Pos 7 5) 9; Literal (Pos 7 6) 1; Literal (Pos 7 6) 2;
Literal (Pos 7 6) 3; Literal (Pos 7 6) 4; Literal (Pos 7 6) 5;
Literal (Pos 7 6) 6; Literal (Pos 7 6) 7; Literal (Pos 7 6) 8;
Literal (Pos 7 6) 9; Literal (Pos 7 7) 1; Literal (Pos 7 7) 2;
Literal (Pos 7 7) 3; Literal (Pos 7 7) 4; Literal (Pos 7 7) 5;
Literal (Pos 7 7) 6; Literal (Pos 7 7) 7; Literal (Pos 7 7) 8;
Literal (Pos 7 7) 9; Literal (Pos 7 8) 1; Literal (Pos 7 8) 2;
Literal (Pos 7 8) 3; Literal (Pos 7 8) 4; Literal (Pos 7 8) 5;
Literal (Pos 7 8) 6; Literal (Pos 7 8) 7; Literal (Pos 7 8) 8;
Literal (Pos 7 8) 9; Literal (Pos 8 0) 1; Literal (Pos 8 0) 2;
Literal (Pos 8 0) 3; Literal (Pos 8 0) 4; Literal (Pos 8 0) 5;
Literal (Pos 8 0) 6; Literal (Pos 8 0) 7; Literal (Pos 8 0) 8;
Literal (Pos 8 0) 9; Literal (Pos 8 1) 1; Literal (Pos 8 1) 2;
Literal (Pos 8 1) 3; Literal (Pos 8 1) 4; Literal (Pos 8 1) 5;
Literal (Pos 8 1) 6; Literal (Pos 8 1) 7; Literal (Pos 8 1) 8;
Literal (Pos 8 1) 9; Literal (Pos 8 2) 1; Literal (Pos 8 2) 2;
Literal (Pos 8 2) 3; Literal (Pos 8 2) 4; Literal (Pos 8 2) 5;
Literal (Pos 8 2) 6; Literal (Pos 8 2) 7; Literal (Pos 8 2) 8;
Literal (Pos 8 2) 9; Literal (Pos 8 3) 1; Literal (Pos 8 3) 2;
Literal (Pos 8 3) 3; Literal (Pos 8 3) 4; Literal (Pos 8 3) 5;
Literal (Pos 8 3) 6; Literal (Pos 8 3) 7; Literal (Pos 8 3) 8;
Literal (Pos 8 3) 9; Literal (Pos 8 4) 1; Literal (Pos 8 4) 2;
Literal (Pos 8 4) 3; Literal (Pos 8 4) 4; Literal (Pos 8 4) 5;
Literal (Pos 8 4) 6; Literal (Pos 8 4) 7; Literal (Pos 8 4) 8;
Literal (Pos 8 4) 9; Literal (Pos 8 5) 1; Literal (Pos 8 5) 2;
Literal (Pos 8 5) 3; Literal (Pos 8 5) 4; Literal (Pos 8 5) 5;
Literal (Pos 8 5) 6; Literal (Pos 8 5) 7; Literal (Pos 8 5) 8;
Literal (Pos 8 5) 9; Literal (Pos 8 6) 1; Literal (Pos 8 6) 2;
Literal (Pos 8 6) 3; Literal (Pos 8 6) 4; Literal (Pos 8 6) 5;
Literal (Pos 8 6) 6; Literal (Pos 8 6) 7; Literal (Pos 8 6) 8;
Literal (Pos 8 6) 9; Literal (Pos 8 7) 1; Literal (Pos 8 7) 2;
Literal (Pos 8 7) 3; Literal (Pos 8 7) 4; Literal (Pos 8 7) 5;
Literal (Pos 8 7) 6; Literal (Pos 8 7) 7; Literal (Pos 8 7) 8;
Literal (Pos 8 7) 9; Literal (Pos 8 8) 1; Literal (Pos 8 8) 2;
Literal (Pos 8 8) 3; Literal (Pos 8 8) 4; Literal (Pos 8 8) 5;
Literal (Pos 8 8) 6; Literal (Pos 8 8) 7; Literal (Pos 8 8) 8;
Literal (Pos 8 8) 9]
: list literal
*)
(*
Sort clauses in the ascending order of the nat part, which indicates the number of literals associated with the clause.
XXX: TODO
Definition sort_clauses
*)