Skip to main content

network_custom_kb/
network_custom_kb.rs

1//! Learn the ATM protocol over TCP via `NetworkActiveKnowledgeBase`.
2//!
3//! Run with:
4//! 1. `cargo run --example custom_kb_server`
5//! 2. `cargo run --example network_custom_kb`
6
7use rust_lstar::knowledge_base::{KnowledgeBaseTrait, NetworkActiveKnowledgeBase};
8use rust_lstar::*;
9use std::sync::{Arc, Mutex};
10use std::time::Duration;
11
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13    println!("=== Network Custom KB (ATM) Example ===\n");
14
15    // Expects an independent ATM server running
16    // (see examples/custom_kb_server.rs).
17    let kb = NetworkActiveKnowledgeBase::new("127.0.0.1".to_string(), 3001, Duration::from_secs(5));
18
19    let vocabulary = vec![
20        "INSERT_CARD".to_string(),
21        "ENTER_PIN".to_string(),
22        "REQUEST_WITHDRAW".to_string(),
23        "EJECT_CARD".to_string(),
24        "TIMEOUT".to_string(),
25    ];
26
27    println!("Target Host: {}", kb.target_host());
28    println!("Target Port: {}\n", kb.target_port());
29
30    let kb: Arc<Mutex<dyn KnowledgeBaseTrait>> = Arc::new(Mutex::new(kb));
31    let mut learner = LSTAR::new(vocabulary, kb, 8, None, None);
32
33    match learner.learn() {
34        Ok(automata) => {
35            println!("\n=== Learned ATM Automaton from Network Target ===\n");
36            println!("{}", automata.build_dot_code());
37            println!(
38                "\nStates: {}\nTransitions: {}",
39                automata.get_states().len(),
40                automata.transitions.len()
41            );
42        }
43        Err(e) => {
44            eprintln!("Learning error: {}", e);
45            println!("\nTo run this example with a real connection:");
46            println!("  1. Start ATM server: cargo run --example custom_kb_server");
47            println!("  2. Run this example again: cargo run --example network_custom_kb");
48        }
49    }
50
51    Ok(())
52}