#逻辑 #命题 #系统 #递归 #命题式 #评估 #

puan-pv

实现了评估功能的命题逻辑语句

5个版本

0.1.4 2023年11月22日
0.1.3 2023年10月12日
0.1.2 2023年10月12日
0.1.1 2023年10月12日
0.1.0 2023年10月12日

#335 in 数学

每月48次下载

Apache-2.0

33KB
844

什么是dis?

这是一个简单的命题到值,或者说是命题包。如果您想模拟一个逻辑系统,该系统产生的值取决于系统后续评估的解释,则它将完美运行。每个命题都是递归定义的,这意味着一个元素本身也可以是一个命题。


命题系统

本包的第一部分是一个逻辑命题系统,具有预定义的逻辑结构。每个定义的命题都可以评估(或解释)和否定。

示例

至少命题

定义至少为2的命题如下

use std::rc::Rc;

let at_least = AtLeast {
    variables: vec![
        Rc::new( Proposition::Variable( Variable {id: String::from("a") } ) ),
        Rc::new( Proposition::Variable( Variable {id: String::from("b") } ) ),
        Rc::new( Proposition::Variable( Variable {id: String::from("c") } ) ),
    ],
    at_least: 2,
    id: None,
};

// Trying out different interpretations
// Only "a" should result in 0 or false
assert_eq!(
    implication_proposition.interpret(
        &interit! {
            String::from("a") => 1.0
        }
    ), 
    0.0
);

// "a" and "b" should result in 1 or true
assert_eq!(
    implication_proposition.interpret(
        &interit! {
            String::from("a") => 1.0
        }
    ), 
    1.0
);

定义一个"如果a和b,则x,y和z"的命题如下

### Implication proposition
```rust

use std::rc::Rc;

let implication_proposition = Implies {
    left: Rc::new (
        Proposition::And(
            And {
                variables: vec![
                    Rc::new( Proposition::Variable( Variable {id: String::from("a") } ) ),
                    Rc::new( Proposition::Variable( Variable {id: String::from("b") } ) ),
                ],
                id: None,
            }
        )
    ),
    right: Rc::new (
        Proposition::And( 
            And {
                variables: vec![
                    Rc::new( Proposition::Variable( Variable {id: String::from("x") } ) ),
                    Rc::new( Proposition::Variable( Variable {id: String::from("y") } ) ),
                    Rc::new( Proposition::Variable( Variable {id: String::from("z") } ) ),
                ],
                id: None,
            }
        )
    ),
    id: None,
};
assert_eq!(
    implication_proposition.interpret(
        &interit! {
            String::from("a") => 0.0
        }
    ), 
    1.0
);
assert_eq!(
    implication_proposition.interpret(
        &interit! {
            String::from("a") => 1.0,
            String::from("b") => 1.0
        }
    ), 
    0.0
);
assert_eq!(
    implication_proposition.interpret(
        &interit! {
            String::from("a") => 1.0,
            String::from("b") => 1.0,
            String::from("x") => 1.0,
            String::from("y") => 1.0,
            String::from("z") => 1.0
        }
    ), 
    1.0
);

依赖关系

~0.8–1.4MB
~33K SLoC