考虑这个小程序:
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).?
我有几个实现一些接口的类.现在我想创建一个新类,它可以在使用接口方法时根据运行时计算扩展其中一个类.我们在代码中谈谈:
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的构造函数和存储到类属性的方式..?
我有一点问题,不知道在哪里找到解决方案.你可能听说过飞鸟的问题:
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找到第一个骗子,它将停止回溯,我找不到任何其他解决方案.也许之后会很明显,但现在我没有任何想法......
提前致谢(也许对不起我的英文:))
我搜索了互联网并阅读了几个小时的手册,但我无法弄清楚这一个:
我的程序获得一个可选参数,即文件名.考虑这个条件
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中遇到错误,所以我不知道应该将哪种类型传递给此函数.我只试过盲目的镜头.