compiler_demo/
compiler_demo.rs1fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("=== MiniZinc Translation & Solving Demo ===\n");
8
9 let simple_var_source = r#"
11var 1..10: x;
12var 1..10: y;
13constraint x < y;
14solve satisfy;
15"#;
16
17 println!("Example 1: Simple Variables with Constraint");
18 println!("MiniZinc Source:");
19 println!("{}", simple_var_source);
20
21 let ast = zelen::parse(simple_var_source)?;
22 let translated = zelen::Translator::translate_with_vars(&ast)?;
23
24 println!("✓ Translated to Selen Model");
25 println!(" Variables: {:?}", translated.int_vars.keys().collect::<Vec<_>>());
26
27 match translated.model.solve() {
28 Ok(solution) => {
29 println!("✓ Solution found!");
30 if let Some(&x) = translated.int_vars.get("x") {
31 if let Some(&y) = translated.int_vars.get("y") {
32 if let selen::variables::Val::ValI(x_val) = solution[x] {
33 if let selen::variables::Val::ValI(y_val) = solution[y] {
34 println!(" x = {}, y = {}", x_val, y_val);
35 }
36 }
37 }
38 }
39 }
40 Err(e) => {
41 println!("✗ No solution: {:?}", e);
42 }
43 }
44
45 println!("\n{}\n", "=".repeat(60));
46
47 let param_source = r#"
49int: n = 5;
50var 1..n: x;
51solve satisfy;
52"#;
53
54 println!("Example 2: Parameter with Expression");
55 println!("MiniZinc Source:");
56 println!("{}", param_source);
57
58 let ast = zelen::parse(param_source)?;
59 let translated = zelen::Translator::translate_with_vars(&ast)?;
60
61 println!("✓ Translated to Selen Model");
62 println!(" Parameters: n = 5");
63 println!(" Variables: {:?}", translated.int_vars.keys().collect::<Vec<_>>());
64
65 match translated.model.solve() {
66 Ok(solution) => {
67 println!("✓ Solution found!");
68 if let Some(&x) = translated.int_vars.get("x") {
69 if let selen::variables::Val::ValI(x_val) = solution[x] {
70 println!(" x = {} (domain was 1..5)", x_val);
71 }
72 }
73 }
74 Err(e) => {
75 println!("✗ No solution: {:?}", e);
76 }
77 }
78
79 println!("\n{}\n", "=".repeat(60));
80
81 let array_source = r#"
83array[1..4] of var 1..4: queens;
84constraint alldifferent(queens);
85solve satisfy;
86"#;
87
88 println!("Example 3: N-Queens Array with Alldifferent");
89 println!("MiniZinc Source:");
90 println!("{}", array_source);
91
92 let ast = zelen::parse(array_source)?;
93 let translated = zelen::Translator::translate_with_vars(&ast)?;
94
95 println!("✓ Translated to Selen Model");
96 println!(" Variable arrays: {:?}", translated.int_var_arrays.keys().collect::<Vec<_>>());
97
98 match translated.model.solve() {
99 Ok(solution) => {
100 println!("✓ Solution found!");
101 if let Some(queens) = translated.int_var_arrays.get("queens") {
102 print!(" queens = [");
103 for (i, var_id) in queens.iter().enumerate() {
104 if i > 0 { print!(", "); }
105 if let selen::variables::Val::ValI(val) = solution[*var_id] {
106 print!("{}", val);
107 }
108 }
109 println!("]");
110 }
111 }
112 Err(e) => {
113 println!("✗ No solution: {:?}", e);
114 }
115 }
116
117 println!("\n=== Translation & Solving Complete ===");
118
119 Ok(())
120}