SWI-Prolog没有修改静态过程`(=)/ 2'的权限

时间:2018-07-22 11:09:21

标签: prolog

这个问题已经问了很多(例如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。

2 个答案:

答案 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.