有没有办法用Java来模仿Łukasiewicz的三值逻辑?
更具体地说,我想模仿Łukasiewicz的Ł运算符。
例如,我需要构造这个Predicate<String>,它提供了以下结果:
predicate.test("0") = false
predicate.test(null) = true
predicate.test("1") = true当被否定时,给出:
predicate.negate().test("0") = true
predicate.negate().test(null) = true
predicate.negate().test("1") = false如果要测试的值是A,则谓词计算MA。negate()所做的是计算¬MA,而我希望它计算M¬A。
不用费心想出一个答案,用三值替代Predicate来代替boolean,因为我自己很清楚如何做到这一点。我问这个问题是为了了解是否可以使用纯Java8,只需少量额外的编码工作。
发布于 2015-11-29 11:36:03
看起来这就是你想要的
static <T> Predicate<T> p(Predicate<? super T> o){ //(I'm not sure what to name this)
return new Predicate<T>(){
@Override
public boolean test(T t) {
return t == null || o.test(t);
}
@Override
public Predicate<T> negate(){
return p(o.negate());
}
};
}
....
Predicate<String> predicate = p(t -> !"0".equals(t));如果要测试的值为null,则返回true,否则使用原始谓词。要否定,我们只需否定原来的谓词。
如果null并不总是第三个值,您可以传入另一个谓词来测试这个值:
static <T> Predicate<T> p(Predicate<? super T> isUnknown, Predicate<? super T> isTrue){
return new Predicate<T>(){
@Override
public boolean test(T t) {
return isUnknown.test(t) || isTrue.test(t);
}
@Override
public Predicate<T> negate(){
return p(isUnknown, isTrue.negate());
}
};
}发布于 2015-11-29 11:26:25
如果我们将negate()的默认实现保留在Predicate类中,就不可能做到这一点:默认情况下,这将构造一个总是返回初始谓词的相反布尔值的谓词。因此,不可能同时使用predicate.test(null)和predicate.negate().test(null)返回true。
因此,我们需要实现我们自己的谓词。在下面的实现中,使用negate布尔值维护状态。它指示trueValue或falseValue返回的正确值。对于thirdValue,总是返回true。如果谓词使用的值不是这三个值中的一个,则总是返回false (在您的问题中没有提到这个例子,所以可以随意修改)。
public static void main(String... args) {
Predicate<String> predicate = lukasiewicz("1", "0", null);
System.out.println(predicate.test("0"));
System.out.println(predicate.test(null));
System.out.println(predicate.test("1"));
System.out.println(predicate.negate().test("0"));
System.out.println(predicate.negate().test(null));
System.out.println(predicate.negate().test("1"));
}
private static <T> Predicate<T> lukasiewicz(T trueValue, T falseValue, T thirdValue) {
class LukasiewiczPredicate implements Predicate<T> {
private boolean negate;
private LukasiewiczPredicate(boolean negate) {
this.negate = negate;
}
@Override
public boolean test(T t) {
if (Objects.equals(trueValue, t)) return negate;
if (Objects.equals(falseValue, t)) return !negate;
if (Objects.equals(thirdValue, t)) return true;
return false;
}
@Override
public Predicate<T> negate() {
return new LukasiewiczPredicate(!negate);
}
};
return new LukasiewiczPredicate(true);
}https://stackoverflow.com/questions/33982052
复制相似问题