|
|
@ -20,61 +20,45 @@ let guard c x = if c then return x else [] |
|
|
|
======================================== *) |
|
|
|
======================================== *) |
|
|
|
|
|
|
|
|
|
|
|
(* Convert a pol and an id to a string, adding + or - before the id *) |
|
|
|
(* Convert a pol and an id to a string, adding + or - before the id *) |
|
|
|
|
|
|
|
|
|
|
|
let pol_to_string pol id = |
|
|
|
let pol_to_string pol id = |
|
|
|
if pol = Pos then "+" ^ id |
|
|
|
if pol = Pos then "+" ^ id |
|
|
|
else if pol = Neg then "-" ^ id |
|
|
|
else if pol = Neg then "-" ^ id |
|
|
|
else id |
|
|
|
else id |
|
|
|
|
|
|
|
|
|
|
|
(* Convert a ray (which is polarized) to a term *) |
|
|
|
(* Convert a ray (which is polarized) to a term *) |
|
|
|
|
|
|
|
|
|
|
|
let rec ray_to_term r = |
|
|
|
let rec ray_to_term r = |
|
|
|
match r with |
|
|
|
match r with |
|
|
|
| Var id -> (Var(id) : term) |
|
|
|
| Var id -> (Var(id) : term) |
|
|
|
| Func(id, pol, raylist) -> (Func(pol_to_string pol id, List.map ray_to_term raylist) : term) |
|
|
|
| Func(id, pol, raylist) -> (Func(pol_to_string pol id, List.map ray_to_term raylist) : term) |
|
|
|
|
|
|
|
|
|
|
|
(* Invert polarization of a pol*) |
|
|
|
(* Invert polarization of a pol*) |
|
|
|
|
|
|
|
|
|
|
|
let inv_pol pol = |
|
|
|
let inv_pol pol = |
|
|
|
if pol = Pos then Neg |
|
|
|
if pol = Pos then Neg |
|
|
|
else if pol = Neg then Pos |
|
|
|
else if pol = Neg then Pos |
|
|
|
else pol |
|
|
|
else pol |
|
|
|
|
|
|
|
|
|
|
|
(* Invert the polarization of a ray to allow an easier Unification writing *) |
|
|
|
(* Invert the polarization of a ray to allow an easier Unification writing *) |
|
|
|
|
|
|
|
|
|
|
|
let rec inv_pol_ray ray = |
|
|
|
let rec inv_pol_ray ray = |
|
|
|
match ray with |
|
|
|
match ray with |
|
|
|
| Func(id, pol, raylist) -> Func(id, inv_pol pol, List.map inv_pol_ray raylist) |
|
|
|
| Func(id, pol, raylist) -> Func(id, inv_pol pol, List.map inv_pol_ray raylist) |
|
|
|
| _ -> ray |
|
|
|
| _ -> ray |
|
|
|
|
|
|
|
|
|
|
|
(* Checks if a ray is polarised *) |
|
|
|
(* Checks if a ray is polarised *) |
|
|
|
|
|
|
|
|
|
|
|
let rec is_polarised r = |
|
|
|
let rec is_polarised r = |
|
|
|
match r with |
|
|
|
match r with |
|
|
|
| Var id -> false |
|
|
|
| Var id -> false |
|
|
|
| Func(_, p, r) -> (p <> Npol) || (List.fold_left (fun acc b -> (is_polarised b) || acc) false r) |
|
|
|
| Func(_, p, r) -> (p <> Npol) || (List.fold_left (fun acc b -> (is_polarised b) || acc) false r) |
|
|
|
|
|
|
|
|
|
|
|
(* Checks if two rays are dual, meaning that after inverting polarization of one ray, the two rays can be unified *) |
|
|
|
(* Checks if two rays are dual, meaning that after inverting polarization of one ray, the two rays can be unified *) |
|
|
|
|
|
|
|
|
|
|
|
let dual_check r1 r2 = |
|
|
|
let dual_check r1 r2 = |
|
|
|
if (is_polarised r1 && is_polarised r2) then |
|
|
|
if (is_polarised r1 && is_polarised r2) then |
|
|
|
(solve [(extends_varname (ray_to_term (inv_pol_ray r1)) "0"), (extends_varname ((ray_to_term r2)) "1")] []) |
|
|
|
(solve [(extends_varname (ray_to_term (inv_pol_ray r1)) "0"), (extends_varname ((ray_to_term r2)) "1")] []) |
|
|
|
else None |
|
|
|
else None |
|
|
|
|
|
|
|
|
|
|
|
(* Create an index for a constellation *) |
|
|
|
(* Create an index for a constellation *) |
|
|
|
|
|
|
|
|
|
|
|
let index_constellation const = |
|
|
|
let index_constellation const = |
|
|
|
List.combine (List.init (List.length const) (fun a -> a)) const |
|
|
|
List.combine (List.init (List.length const) (fun a -> a)) const |
|
|
|
|
|
|
|
|
|
|
|
(* Make a list of links between two stars using their indexes*) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let are_linked (i, il) (j, jl) = |
|
|
|
|
|
|
|
List.fold_left (fun link_list ray -> |
|
|
|
|
|
|
|
List.fold_left (fun rl rs -> |
|
|
|
|
|
|
|
let uni = dual_check ray rs in |
|
|
|
|
|
|
|
if Option.is_some uni then ((i,j),(ray,rs))::rl else rl |
|
|
|
|
|
|
|
) [] jl ) [] il |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(* ======================================== |
|
|
|
(* ======================================== |
|
|
|
Constellation graph |
|
|
|
Constellation graph |
|
|
|
======================================== *) |
|
|
|
======================================== *) |
|
|
@ -84,10 +68,13 @@ let dgraph const = |
|
|
|
let indexed_const = index_constellation const in |
|
|
|
let indexed_const = index_constellation const in |
|
|
|
indexed_const >>= fun (i, il) -> |
|
|
|
indexed_const >>= fun (i, il) -> |
|
|
|
indexed_const >>= fun (j, jl) -> |
|
|
|
indexed_const >>= fun (j, jl) -> |
|
|
|
guard (j >= i) (are_linked (i, il) (j, jl)) |
|
|
|
il >>= fun r1 -> |
|
|
|
|
|
|
|
jl >>= fun r2 -> |
|
|
|
|
|
|
|
guard (j >= i) ( let uni = dual_check r1 r2 in |
|
|
|
|
|
|
|
if Option.is_some uni then [((i,j),(r1,r2))] |
|
|
|
|
|
|
|
else []) |
|
|
|
|
|
|
|
|
|
|
|
(* Convert a link to a string to be printable *) |
|
|
|
(* Convert a link to a string to be printable *) |
|
|
|
|
|
|
|
|
|
|
|
let link_to_string dg = |
|
|
|
let link_to_string dg = |
|
|
|
let rec aux dgl = |
|
|
|
let rec aux dgl = |
|
|
|
match dgl with |
|
|
|
match dgl with |
|
|
@ -97,7 +84,6 @@ let link_to_string dg = |
|
|
|
in aux dg ;; |
|
|
|
in aux dg ;; |
|
|
|
|
|
|
|
|
|
|
|
(* Print a dgraph *) |
|
|
|
(* Print a dgraph *) |
|
|
|
|
|
|
|
|
|
|
|
let print_dgraph dg = |
|
|
|
let print_dgraph dg = |
|
|
|
let rec aux dgl = |
|
|
|
let rec aux dgl = |
|
|
|
match dgl with |
|
|
|
match dgl with |
|
|
@ -127,12 +113,7 @@ let constellation = make_const_add 1 3 ;; |
|
|
|
|
|
|
|
|
|
|
|
print_dgraph (dgraph constellation) ;; |
|
|
|
print_dgraph (dgraph constellation) ;; |
|
|
|
|
|
|
|
|
|
|
|
(* test constellation cyclique déterministe *) |
|
|
|
|
|
|
|
(*let boucle = [[Func("c", Neg, [x]) ; Func("c", Pos, [x])]] |
|
|
|
|
|
|
|
print_dgraph (dgraph boucle);; *) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(* exec graph *) |
|
|
|
(* exec graph *) |
|
|
|
|
|
|
|
|
|
|
|
let exec graph const = |
|
|
|
let exec graph const = |
|
|
|
let rec aux graph sol = |
|
|
|
let rec aux graph sol = |
|
|
|
match graph with |
|
|
|
match graph with |
|
|
@ -147,9 +128,8 @@ let exec graph const = |
|
|
|
in aux2 h sol |
|
|
|
in aux2 h sol |
|
|
|
in aux graph (Some [],[]) ;; |
|
|
|
in aux graph (Some [],[]) ;; |
|
|
|
|
|
|
|
|
|
|
|
(* Exec where it just keeps the last equation and re-tries to solve it as a whole instead of applying the solution of the previous equation *) |
|
|
|
(* Exec where it just keeps the last equation and re-tries to solve it as a whole instead of applying the solution of the previous equation *) |
|
|
|
|
|
|
|
let exec2 graph const = |
|
|
|
let exec2 graph const = |
|
|
|
|
|
|
|
let rec aux graph sol = |
|
|
|
let rec aux graph sol = |
|
|
|
match graph with |
|
|
|
match graph with |
|
|
|
| [] -> Some sol |
|
|
|
| [] -> Some sol |
|
|
@ -170,3 +150,7 @@ let exec graph const = |
|
|
|
|
|
|
|
|
|
|
|
exec (dgraph constellation) constellation;; |
|
|
|
exec (dgraph constellation) constellation;; |
|
|
|
exec2 (dgraph constellation) constellation;; |
|
|
|
exec2 (dgraph constellation) constellation;; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(* test constellation cyclique déterministe *) |
|
|
|
|
|
|
|
let boucle = [ [Func("c", Neg, [x]); x] ; [Func("c", Pos, [Func("f", Npol, [y])]) ; Func("c", Npol, [x]) ] ] ;; |
|
|
|
|
|
|
|
print_dgraph (dgraph boucle);; |