这个问题已经问了很多(例如here),但我不明白为什么会发生这种情况以及如何解决它。
我想创建一个列表Z
并计算其元素。这是我的代码:
Z = [a,b,c,d,e].
listlength([],0).
listlength([Head|Tail],Count):-
listlength(Tail,PartialCount),
Count is PartialCount + 1 .
但是我收到以下错误(和警告):
ex3.pl:1: Warning: Singleton variables: [Z]
ex3.pl:1: ERROR: No permission to modify static procedure `(=)/2'
ex3.pl:5: Warning: Singleton variables: [Head]
ex3.pl:5: Warning: Singleton variables: [Head]
我不知道如何解决它,也不知道如何定义列表和测试listlength
规则。我正在使用SWI-Prolog 7.6.4 x64。
答案 0 :(得分:2)
您收到错误。...如何?在做什么 ?我猜,您正在加载具有上述定义的文件。然后将它们中的每一个解释为谓词定义。尤其是
Z = [1,2,3].
被读为好像
=(Z, [1,2,3]).
与
相同=(Z, [1,2,3]) :- true.
这意味着您 正在重新定义内置谓词=/2
。
相反,定义
mypred([1,2,3]).
并在类似查询中使用它
?- mypred(Z), write(Z).
答案 1 :(得分:0)
在listLength.pl
实施您的事实:
listLength([],0).
listLength([_|Tail],Count):- % Fixing Singleton variables: [Head]
listLength(Tail,PartialCount), % Variable `Head` was not in use.
Count is PartialCount + 1 . % Use wildcard `_`
?- Z = [a,b,c,d,e], listLength(Z,5). % For queries in files use `?-`
% Fixing Singleton variables: [Z] and
% No permission to modify static procedure `(=)/2'
使用consult('listLength.pl').
您可以使用实现的listLength/2
:
?- listLength([1,3,4,2],X).
X = 4.
?- listLength([a,b,c,d,e],X).
X = 5.
?- Z=[1,3,a,b,3], listLength(Z,X).
Z = [1, 3, a, b, 3],
X = 5.