在序言中定义会员规则

时间:2018-09-19 01:57:14

标签: prolog

目前,我正在学习序言编程。当我正在研究成员列表(如果元素在列表中)时,在我进行咨询时会显示错误。

?- 
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).

请帮助我解决这个问题。

1 个答案:

答案 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}},我们只将下一个弊端打开包装。

相关问题