Prolog打印所有解决方案并希望获得是/否输出

时间:2015-12-16 23:25:46

标签: prolog

我刚开始学习Prolog,我的任务是写一个谓词poklapanje(M,V),如果列表M的所有元素都是列表V的第一个元素,则返回yes,例如poklapanje([1,2], [1,2,3])应该返回是。我的第一个问题是真实和是的区别是什么,因为我在我的解决方案中变得真实?其次,当我输入poklapanje(X,[1,2,3])时,我应该得到:

X = [];
X = [1];
X = [1,2];
X = [1,2,3];
no

我得到了:

X = [];
false

为什么呢?我想这与我的实现有关,并且打印true / false而不是yes / no。

这是我的代码:

poklapanje([],[_|_]).
poklapanje([A|B],[C|D]):- A == C, poklapanje(B,D).

2 个答案:

答案 0 :(得分:5)

yestrue之间没有区别。这只是Prolog实现之间的区别。例如,我们在SWI-Prolog中获得true,在GNU Prolog中获得yes

我不确定你是如何提出查询的。以下是运行代码的输出:

?- poklapanje(X,[1,2,3]).
X = [] ;
X = [1] ;
X = [1, 2] ;
false.

缺少[1, 2, 3],因为poklapanje([],[_|_]).

poklapanje([],[]).失败

我会像这样实现它:

poklapanje([], _).
poklapanje([A|B],[A|D]) :- poklapanje(B,D).

答案 1 :(得分:2)

由于我无法添加评论(声誉不够),我将此放在此处。我将尝试解释为什么您的代码不起作用以及为什么Fabricator的代码有效。

你遇到的第一个问题是

document.addEventListener("pause", onPause, false);
document.addEventListener("resume", onResume, false);

这不是你想要实现的目标。相反,您想要统一变量,因此请使用

A == C

甚至更好,如正确答案所示

A = C

如果使用A == C进行,在第二步中你将得到1 == C,这将失败,因为C不等于1.

已经解释过的第二个问题是

poklapanje([A|B],[A|D])

将在最后一步失败,其中D是一个空列表。空列表没有任何成员,因此它不会与[_ |统一_]。您可能想使用[_]来解决此问题,但这只会与具有一个成员的列表统一。这就是为什么你必须使用_,它将与任何列表统一起来:

poklapanje([],[_|_]).

希望它能为你清理一下。 : - )