目前,我正在学习序言编程。当我正在研究成员列表(如果元素在列表中)时,在我进行咨询时会显示错误。
?-
Warning: c:/users/h.m.thaheed/pictures/snippingtool++/uploads/exx.pl:1:
Singleton variables: [R]
Warning: c:/users/h.m.thaheed/pictures/snippingtool++/uploads/exx.pl:2:
Singleton variables: [Y]
规则如下:
member(X,[X|R]).
member(X,[Y|R]) :- member(X,R).
请帮助我解决这个问题。
答案 0 :(得分:1)
不是 错误,而是警告。 Prolog解释器警告说,它只能找到一个或多个变量的一次出现,这很奇怪,因为通常使用变量来执行统一,将值从一个谓词传递到另一个谓词,等等。
一次定义一个变量仅作为占位符有意义:当您需要指定一个变量以执行正确的统一时。但是Prolog有一种标准化的方法:使用下划线_
。您可以将下划线视为“丢弃变量”。如果谓词包含两个(或多个)下划线,则这些是两个(不同)变量。下划线的目的是要清楚地表明这是一个占位符,从而可以消除警告。
因此,您可以将谓词重写为:
member(X,[X|_]).
member(X,[_|R]) :- member(X,R).
请注意,member/2
的许多实现都使用member/3
帮助谓词来避免对每个“ cons”(列表元素)进行两次解包,例如在SWI-Prolog中,我们看到:
member(El, [H|T]) :- member_(T, El, H). member_(_, El, El). member_([H|T], El, _) :- member_(T, El, H).
因此,这里我们在谓词调用的参数中解压缩列表。这意味着member_
的第一个子句和第二个子句不需要在头中执行拆包(我们在这里对解释器的工作原理进行了一些假设),而在{{ 1}},我们只将下一个弊端打开包装。