我刚开始学习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).
答案 0 :(得分:5)
yes
和true
之间没有区别。这只是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([],[_|_]).
希望它能为你清理一下。 : - )