【发布时间】:2017-11-12 12:06:36
【问题描述】:
我是 Prolog 的新手,对编程练习有疑问:
我有一个程序,我认为大部分时间都在工作,但是对于特定的查询,我没有得到答案
is_number(0).
is_number(s(N)) :-
is_number(N).
numberpair(pair(X,Y)) :-
is_number(X),
is_number(Y).
?- numberpair(pair(A,B)), A=s(s(0)), B=s(s(s(0))).
所以我知道,Prolog 现在尝试 A 和 B 的所有可能数字 -> [0,s(0),s(s(0)),s(s(s(0))), ... ] 但如果它找到 A 的答案(即s(s(0))),它会在 B 处失败,在下一次调用中,它会尝试 A 的下一个答案(即 s(s(s(0)))),依此类推。
现在的问题是,我希望 Prolog 停止,如果它找到 A 的答案,并且现在只搜索 B 的答案。
谁能给我一个提示,如何解决这个问题?
【问题讨论】:
-
错字:
numberpairD-->numberpair? -
啊,是的,对不起……
-
这没有答案,因为您的查询没有意义。您要求 Prolog 以某种方式神奇地看到查询的未来。它一次只能成功实现一个目标。您不能让它在第三个目标 (
B=s(s(s(0)))) 上失败并让它回溯到第一个目标 (numberpair(pair(A,B))),而是在回溯时跳过第二个目标 (A=s(s(0)))。您需要重新定义查询以使其有意义。 -
@lurker:不是。
D是一个非常广泛的提示如何解决这个问题。 -
@Enigmativity:该查询确实有意义。它写道:当被要求提供所有解决方案时,是否也会找到这个特定的解决方案。换句话说,枚举是公平的还是不公平的。
标签: prolog successor-arithmetics