819 lines
33 KiB
Coq
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
|
|
*)
|
|
|