如何将这些模糊逻辑运算应用于我的自定义布尔类?

How do I apply these fuzzy logic operations to my custom boolean class?

提问人:Martin Bocanegra 提问时间:11/22/2021 最后编辑:Martin Bocanegra 更新时间:12/5/2021 访问量:183

问:

上下文

我有一个自定义的模糊布尔类,称为 F_Bool,它由介于 0 和 1 之间的值(包括 0 和 1)表示。

(请参阅下面的代码示例)

我所知道的

在大多数模糊逻辑应用中,逻辑运算符 、 和 非常简单。对于 、 和 。|&!a|b => Max(a.val, b.val)a&b => Min(a.val, b.val)!a => 1 - a.val

对于 和 等运算符,任务变得有点棘手。对于(经过一些试验和错误)我发现我可以取平均值.对于(经过更多的试验和错误)我发现.+-a+ba+b => (a.val + b.val) / 2a-ba-b => a+!b => (1 + a.val - b.val) / 2

我被卡住的地方

我知道我的加法和减法“解决方案”并不理想,因为它不允许(这应该是三个值的平均值),但我稍后可以弄清楚。a+b+c

我主要想知道如何以类似的方式为我的类实现 and 运算符,以及这样的操作在模糊布尔逻辑方面可能意味着什么。*/

问题

如果将两个模糊布尔值“相加”等同于平均它们的值,那么将两个模糊布尔值相乘/相除是什么意思?甚至有逻辑等价物吗?

下面是我所说的代码示例。

代码示例

// Represents a boolean using a decimal
public class F_Bool
{
    // The fuzzified value
    public decimal val;

    // The defuzzified value
    public bool boolVal {
        get => val >= 0.5M;
        set => val = value ? 1M : 0M;
    }

    // Constructors
    public F_Bool (decimal value) =>
        val = value;
    public F_Bool (bool value) =>
        boolVal = value;

    // AND: takes the Min value of {a, b}
    public static F_Bool operator &(F_Bool a, F_Bool b) =>
        new F_Bool( Math.Min(a.val, b.val) );

    //  OR: takes the Max value of {a, b}
    public static F_Bool operator |(F_Bool a, F_Bool b) =>
        new F_Bool( Math.Max(a.val, b.val) );

    // NOT: Inverts the value of f
    public static F_Bool operator !(F_Bool f) =>
        new F_Bool (1 - f.val);

    // SUM: Returns the average of {a, b}
    public static F_Bool operator +(F_Bool a, F_Bool b) =>
        new F_Bool ( (a.val+ b.val) / 2 );

    // DIF: Returns the average of {a, NOT b}
    public static F_Bool operator -(F_Bool a, F_Bool b) =>
        a + !b;

    /* Trivially Implemented */

    // PRODUCT: ??? of {?a?, ?b?}
    /* I presume I will return a*b; */
    public static F_Bool operator *(F_Bool a, F_Bool b) {
        if(a.val== 0 | b.val== 0) return new F_Bool(0);
        else if(b.val== 1) return a;
        else if(a.val== 1) return b;
        else // return a * b; // correct?
            throw new NotImplementedException();
    }
    
    // QUOTIENT: ??? of {?a?, ?b?}
    /* I have no idea, but a/b is wrong. *
     *   - Would Min(a,b)/Max(a,b) work? *
     *   - What about (a-b)/(a+b)?       */
    public static F_Bool operator /(F_Bool a, F_Bool b) {
        if(b.val == 0) throw new DivideByZeroException();
        else if(a.val == 0) return 0;
        else if(b.val == 1) return a;
        else  // return a/b; // incorrect! (produces values > 1)
            throw new NotImplementedException();
    }
}
非常感谢任何帮助

谢谢!

C# 运算符重载 变量赋值 逻辑

评论

0赞 Martin Bocanegra 11/23/2021
如果算术平均值是将两个 s 相加时使用的方法,那么可以使用其他毕达哥拉斯均值之一来乘法或除法吗?F_Bool
0赞 Martin Bocanegra 11/23/2021
我什至正确地考虑加法吗?我知道这是一个相当武断的选择,但这对我来说似乎是有道理的。我的推理是,如果 1(真)与 0(假)相加,结果应该在两者之间,即 1+0 => 0.5。这个逻辑成立吗?

答: 暂无答案