【问题标题】:Implementing a three-valued logic operation with Boolean operators?使用布尔运算符实现三值逻辑运算?
【发布时间】:2021-11-15 17:47:26
【问题描述】:

我创建了一个包含三个可能常量的枚举类 Proposition,

public enum Proposition {

    TRUE, FALSE, NULL;

} 

我想在我使用布尔运算符编写代码时做到这一点

Proposition propA = Proposition.FALSE;

Proposition propB = Proposition.NULL;

Proposition propC = propA && propB;

propC 将按照 Kleene 的逻辑变为 NULL。 https://en.wikipedia.org/wiki/Three-valued_logic

我将如何在 Java 中实现它?我必须使用方法还是可以使用布尔运算符?

【问题讨论】:

  • Java 中不能覆盖运算符,所以不能。您可以使用 Boolean,它确实代表三态,但您的 null 情况不会像您预期的那样工作。
  • 意思是我一般不能对自定义类使用运算符,对吧?
  • “我一般不能对自定义类使用运算符”——是的,java 没有运算符重载。相反,您必须在 Proposition 类中定义方法,例如 Proposition Proposition::and(Proposition other)
  • 对。某些语言允许您为自己的类中的任何运算符定义自定义语义。 In C++,他们使用<<,这是一个旨在进行位移的运算符,让您更轻松地写入标准输出std::cout << "print me";。它对于矩阵乘法matrix1 * matrix2 和其他很多东西很有用。 Java 没有这个特性

标签: java logic


【解决方案1】:

您可以使用枚举方法自己实现这一点(类似于我们从Predicate 得到的);运算符不能在 Java 中被覆盖。这是一个例子:

enum Proposition {
    TRUE(Boolean.TRUE),
    FALSE(Boolean.FALSE),
    NULL(null) {
        @Override
        public Proposition and(Proposition other) {
            return this;
        }

        @Override
        public Proposition or(Proposition other) {
            return this;
        }
    };

    private final Boolean value;
    Proposition(Boolean value) {
        this.value = value;
    }

    public Proposition and(Proposition other) {
        if (NULL == other) return NULL;
        return of(this.value && other.value);
    }
    public Proposition or(Proposition other) {
        if (NULL == other) return NULL;
        return of(this.value || other.value);
    }

    public static Proposition of(Boolean bool) {
        return null == bool ? NULL : (bool ? TRUE : FALSE);
    }
}

这是与您的示例对应的调用:

Proposition propA = Proposition.FALSE;
Proposition propB = Proposition.NULL;

Proposition propC = propA.and(propB);
System.out.println(propC); // NULL

换句话说,为|| 调用.or() 方法,为&& 调用.and() 方法。

【讨论】:

  • 我对枚举知之甚少,我该如何使用它?
  • 将添加示例调用,@SimoneTarenzi
  • 非常感谢,这正是我想要的。
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
相关资源
最近更新 更多