首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Łukasiewicz谓词逻辑?

Łukasiewicz谓词逻辑?
EN

Stack Overflow用户
提问于 2015-11-29 11:04:37
回答 2查看 223关注 0票数 4

有没有办法用Java来模仿Łukasiewicz的三值逻辑?

更具体地说,我想模仿Łukasiewicz的Ł运算符。

例如,我需要构造这个Predicate<String>,它提供了以下结果:

代码语言:javascript
复制
predicate.test("0") = false
predicate.test(null) = true
predicate.test("1") = true

当被否定时,给出:

代码语言:javascript
复制
predicate.negate().test("0") = true
predicate.negate().test(null) = true
predicate.negate().test("1") = false

如果要测试的值是A,则谓词计算MAnegate()所做的是计算¬MA,而我希望它计算M¬A

不用费心想出一个答案,用三值替代Predicate来代替boolean,因为我自己很清楚如何做到这一点。我问这个问题是为了了解是否可以使用纯Java8,只需少量额外的编码工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-29 11:36:03

看起来这就是你想要的

代码语言:javascript
复制
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并不总是第三个值,您可以传入另一个谓词来测试这个值:

代码语言:javascript
复制
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());
        }
    };
}
票数 2
EN

Stack Overflow用户

发布于 2015-11-29 11:26:25

如果我们将negate()的默认实现保留在Predicate类中,就不可能做到这一点:默认情况下,这将构造一个总是返回初始谓词的相反布尔值的谓词。因此,不可能同时使用predicate.test(null)predicate.negate().test(null)返回true

因此,我们需要实现我们自己的谓词。在下面的实现中,使用negate布尔值维护状态。它指示trueValuefalseValue返回的正确值。对于thirdValue,总是返回true。如果谓词使用的值不是这三个值中的一个,则总是返回false (在您的问题中没有提到这个例子,所以可以随意修改)。

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33982052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档