# ExMaude Advanced Usage
```elixir
Mix.install(
[
{:ex_maude, path: Path.join(__DIR__, ".."), env: :dev}
],
config_path: :ex_maude,
lockfile: :ex_maude,
config: [
ex_maude: [start_pool: true, use_pty: false]
]
)
```
## Loading Custom Modules
ExMaude can load custom Maude modules from files or strings.
### Loading from File
```elixir
# Load the bundled IoT rules module
ExMaude.load_file(ExMaude.iot_rules_path())
```
### Loading from String
```elixir
# Define a simple counter module
counter_module = """
mod COUNTER is
protecting NAT .
sort Counter .
op counter : Nat -> Counter [ctor] .
op inc : Counter -> Counter .
op dec : Counter -> Counter .
op value : Counter -> Nat .
var N : Nat .
eq inc(counter(N)) = counter(s(N)) .
eq dec(counter(0)) = counter(0) .
eq dec(counter(s(N))) = counter(N) .
eq value(counter(N)) = N .
endm
"""
ExMaude.load_module(counter_module)
```
```elixir
# Use the custom module
ExMaude.reduce("COUNTER", "value(inc(inc(counter(0))))")
```
```elixir
ExMaude.reduce("COUNTER", "value(dec(counter(5)))")
```
## IoT Conflict Detection
ExMaude includes a powerful IoT rule conflict detection system based on formal verification techniques from the [AutoIoT paper](https://arxiv.org/abs/2411.10665).
### Conflict Types
1. **State Conflict** - Two rules target the same device with incompatible values
2. **Environment Conflict** - Two rules produce opposing environmental effects
3. **State Cascade** - A rule's output triggers another rule unexpectedly
4. **State-Environment Cascade** - Combined effects cascade through rules
### Example: Detecting State Conflicts
```elixir
# First, load the IoT rules module
ExMaude.load_file(ExMaude.iot_rules_path())
```
```elixir
# Define conflicting rules
rules = [
%{
id: "motion-light",
thing_id: "light-1",
trigger: {:prop_eq, "motion", true},
actions: [{:set_prop, "light-1", "state", "on"}],
priority: 1
},
%{
id: "night-light",
thing_id: "light-1",
trigger: {:prop_gt, "time", 2300},
actions: [{:set_prop, "light-1", "state", "off"}],
priority: 1
}
]
ExMaude.IoT.detect_conflicts(rules)
```
### Complex Rule Definitions
```elixir
# Rules with compound triggers
complex_rules = [
%{
id: "smart-ac",
thing_id: "ac-1",
trigger: {:and, {:prop_gt, "temperature", 25}, {:prop_eq, "presence", true}},
actions: [{:set_prop, "ac-1", "state", "on"}, {:set_env, "temperature", 22}],
priority: 2
},
%{
id: "window-vent",
thing_id: "window-1",
trigger: {:prop_gt, "co2", 800},
actions: [{:set_prop, "window-1", "state", "open"}],
priority: 1
},
%{
id: "ac-saver",
thing_id: "ac-1",
trigger: {:prop_eq, "window-open", true},
actions: [{:set_prop, "ac-1", "state", "off"}],
priority: 3
}
]
ExMaude.IoT.detect_conflicts(complex_rules)
```
## Pool Management
ExMaude uses a pool of Maude processes for concurrent operations.
### Pool Status
```elixir
ExMaude.Pool.status()
```
### Concurrent Operations
```elixir
# Run multiple operations concurrently
tasks =
for i <- 1..5 do
Task.async(fn ->
ExMaude.reduce("NAT", "#{i} * #{i}")
end)
end
Task.await_many(tasks)
```
## Telemetry
ExMaude emits telemetry events for monitoring and observability.
### Available Events
```elixir
ExMaude.Telemetry.events()
```
### Attaching a Handler
```elixir
# Simple logging handler
handler = fn event, measurements, metadata, _config ->
IO.puts("Event: #{inspect(event)}")
IO.puts(" Duration: #{measurements[:duration]} native units")
IO.puts(" Metadata: #{inspect(metadata)}")
end
:telemetry.attach(
"demo-handler",
[:ex_maude, :command, :stop],
handler,
nil
)
```
```elixir
# This will trigger the telemetry event
ExMaude.reduce("NAT", "100 + 200")
```
```elixir
# Clean up
:telemetry.detach("demo-handler")
```
## Raw Command Execution
For full control, execute raw Maude commands:
```elixir
# Show module information
ExMaude.execute("show module NAT .")
```
```elixir
# List all loaded modules
ExMaude.execute("show modules .")
```
```elixir
# Execute multiple commands
commands = """
reduce in NAT : 1 + 1 .
reduce in NAT : 2 * 3 .
reduce in INT : -5 + 10 .
"""
ExMaude.execute(commands)
```
## Next Steps
* [Quick Start](quickstart.livemd) - Basic operations
* [Term Rewriting](rewriting.livemd) - Deep dive into rewriting and search
* [Benchmarks](benchmarks.livemd) - Performance metrics