# Propositional Logic

[](https://github.com/AnthonyMichaelTDM/propositional-logic-rs/actions/workflows/rust.yml)
A rust library for generating the truth table of any single compound proposition.
only has one dependency: [cli_table](https://crates.io/crates/cli_table)
## Usage
### truth_table! macro
this macro only creates and returns the truth table.
```rust
use propositional_logic::prelude::*;
use cli_table::{print_stdout, TableStruct};
let compound_proposition = |p, q, r| -> bool { iff(q, (p && !q) || (!p && q)) && r };
// giving it a function (any function with boolean input and output works, technically)
let table: TableStruct = truth_table!(|p, q, r| => compound_proposition);
// giving it an inline proposition (similar to a closure)
let table: TableStruct = truth_table!(|p, q, r| => inline_compound_proposition -> {
// giving it both (you can give it as many as you want)
let table: TableStruct = truth_table!(|p, q, r| => {
compound_proposition,
inline_compound_proposition -> {
iff(q, (p && !q) || (!p && q)) && r
}
});
assert!(print_stdout(table).is_ok());
```
Outputs:
```text
+-------+-------+-------+----------------------+-----------------------------+
| true | true | true | false | false |
+-------+-------+-------+----------------------+-----------------------------+
| true | true | false | false | false |
+-------+-------+-------+----------------------+-----------------------------+
| true | false | true | false | false |
+-------+-------+-------+----------------------+-----------------------------+
| true | false | false | false | false |
+-------+-------+-------+----------------------+-----------------------------+
| false | true | true | true | true |
+-------+-------+-------+----------------------+-----------------------------+
| false | true | false | false | false |
+-------+-------+-------+----------------------+-----------------------------+
| false | false | true | true | true |
+-------+-------+-------+----------------------+-----------------------------+
| false | false | false | false | false |
+-------+-------+-------+----------------------+-----------------------------+
```
### print_truth_table! macro
```rust
use propositional_logic::prelude::*;
let compound_proposition = |p, q| -> bool { iff(q, p) };
// giving it a function (any function with boolean input and output works, technically)
// giving it an inline proposition (similar to a closure)
print_truth_table!(|p| => inline_compound_proposition -> {
not(p)
});
println!();
// giving it both (you can give it as many as you want, but every item must have a comma at the end (even the last one))
print_truth_table!(|p,q| => {
compound_proposition,
inline_compound_proposition -> {
not(p)
},
});
```
Output:
```text
+-------+-------+----------------------+
| true | true | true |
+-------+-------+----------------------+
| true | false | false |
+-------+-------+----------------------+
| false | true | false |
+-------+-------+----------------------+
| false | false | true |
+-------+-------+----------------------+
+-------+-----------------------------+
| true | false |
+-------+-----------------------------+
| false | true |
+-------+-----------------------------+
+-------+-------+----------------------+-----------------------------+
| true | true | true | false |
+-------+-------+----------------------+-----------------------------+
| true | false | false | false |
+-------+-------+----------------------+-----------------------------+
| false | true | false | true |
+-------+-------+----------------------+-----------------------------+
| false | false | true | true |
+-------+-------+----------------------+-----------------------------+
```