prolog - 在 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 有一个标准化的方法来做到这一点:使用下划线_
。您可以将下划线视为“丢弃变量”。如果谓词包含两个(或更多)下划线,则它们是两个(不同的)变量。下划线的目的是明确这是一个占位符,因此它将抑制警告。
因此,您可以将谓词重写为:
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一次。
推荐阅读
- c++ - 我的程序不想在 DLL 调用后写入文本文件
- c# - 通过 API Revit 检查文件是否存在
- pandas - AttributeError:模块“numba”没有属性“targets”
- mongodb - 猫鼬查询计数并返回一些结果列表
- python - ValueError:无法将输入数组从形状(20,2)广播到形状(20)
- java - @Value 处的默认值为 Duration
- python-3.x - 在 NetworkX 中重现相同的图形
- c# - 使用 Newtonsoft.Json 反序列化未定义的值
- python - 如何在带有 python 3.7 的 Windows 10 中使用 conda 安装 gdal?安装geoviews后,我再也没有设法使用gdal
- javascript - my animated toggle navigationbar overlaps?