首页 > 解决方案 > 在 prolog 中定义成员规则

问题描述

目前我正在学习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).

请帮我解决这个问题。

标签: prolog

解决方案


这些不是错误,而是警告。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_不需要在头部进行解包(我们这里当然对解释器的确切工作方式做了一些假设),而在 的最后一个子句中member_,我们只解包下一个 cons一次。


推荐阅读