小编tci*_*ler的帖子

关于对称关系的 Prolog 重复解

考虑这个小程序:

married(bill, hillary).
spouse(X, Y) :- married(X, Y); married(Y, X).
likes(X, Y) :- spouse(X, Y).
Run Code Online (Sandbox Code Playgroud)

现在我想评估一个目标

?- likes(X, Y).
X = bill
Y = hillary ?;
X = hillary
Y = bill
yes 
Run Code Online (Sandbox Code Playgroud)

有没有办法防止在回溯时重复这种对称关系,并且仍然保持目标的对称性?- likes(hillary, X).

symmetric prolog relation

5
推荐指数
1
解决办法
939
查看次数

Java扩展了通用原型

我有几个实现一些接口的类.现在我想创建一个新类,它可以在使用接口方法时根据运行时计算扩展其中一个类.我们在代码中谈谈:

public interface Interface {
    public void doSomething();
}

public class A implements Interface {
    @Override
    public void doSomething() {
        System.out.println("hello");
    }
}

public class B implements Interface {
    @Override
    public void doSomething() {
        System.out.println("hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是现有的类,所以现在我需要做这样的事情(当然不行):

public class C<T extends Interface> extends T {
    public void doSomethingElse() {
        this.doSomething();
    }

    public static void main(String[] args) {
        C c;
        if(isSomethingLoaded) {
            c = new C<A>();
        } else {
            c = new C<B>();
        }
        c.doSomethingElse();
    }
}
Run Code Online (Sandbox Code Playgroud)

有可能以某种方式,除了我将参数接口传递给C的构造函数和存储到类属性的方式..?

java generics

2
推荐指数
1
解决办法
92
查看次数

Prolog否定更多解决方案

我有一点问题,不知道在哪里找到解决方案.你可能听说过飞鸟的问题:

bird(eagle).
bird(penguin).
can_fly(penguin):-!,fail.
can_fly(X):-bird(X).
Run Code Online (Sandbox Code Playgroud)

我试图修改并将这些知识用于某些"爱情故事".想象一下

maried(a, b).
maried(c, d).
lovers(a, d).
likes(X, Y):-maried(X, Y).
Run Code Online (Sandbox Code Playgroud)

现在我想说"如果X与Y结婚,但X是Z的情人,那么X不喜欢Y,但喜欢Z".我试过这个:

likes(X, Y) :- lovers(X, Y).
likes(X, Y) :- maried(X, Y), lovers(X, _),!,fail.
likes(X, Y) :- maried(X, Y).
Run Code Online (Sandbox Code Playgroud)

除非我想评估目标,否则它有效

likes(A, B).
Run Code Online (Sandbox Code Playgroud)

如果数据库中有更多的事实并且Prolog找到第一个骗子,它将停止回溯,我找不到任何其他解决方案.也许之后会很明显,但现在我没有任何想法......

提前致谢(也许对不起我的英文:))

prolog backtracking negation

1
推荐指数
1
解决办法
341
查看次数

C++ getline传递文件或cin

我搜索了互联网并阅读了几个小时的手册,但我无法弄清楚这一个:

我的程序获得一个可选参数,即文件名.考虑这个条件

std::ifstream file;

if (argc > 1) {
    file.open(argv[1]);
}

if (file.is_open()) {
    processInput(file);
    file.close();
} else {
    processInput(std::cin);
}
Run Code Online (Sandbox Code Playgroud)

在函数中processInput我试图从输入中读取所有行并使用它们执行以下操作:

void processInput(std::basic_istream<char> inputStream) {
    std::string line;
    while (std::getline(inputStream, line)) {
        processLine(line);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我在basic_istream中遇到错误,所以我不知道应该将哪种类型传递给此函数.我只试过盲目的镜头.

c++ iostream

0
推荐指数
1
解决办法
389
查看次数

标签 统计

prolog ×2

backtracking ×1

c++ ×1

generics ×1

iostream ×1

java ×1

negation ×1

relation ×1

symmetric ×1