如何在Prolog中正确检查指定linea的列表元素归属?
正确查询Prolog线路站点成员的方法
你的问题出在member/2的参数使用错误:member/2的第二个参数必须是列表,但你直接传入了线路编号12,Prolog无法将其关联到对应的站点列表,因此查询失败。
假设你的知识库中linea事实的定义是类似这样的(第二个参数为该线路的站点列表):
linea(12, [mixcoac, tacubaya, chapultepec, zocalo]). linea(9, [centro, del Valle, coyoacan]).
方法1:直接组合查询
通过linea/2先取出线路12对应的站点列表,再用member/2检查目标站点是否在列表中:
linea(12, Sites), member(mixcoac, Sites).
或者交换顺序(逻辑等价,仅回溯顺序不同):
member(mixcoac, Sites), linea(12, Sites).
如果站点存在,Prolog会返回true;若不存在则返回false。
方法2:封装为专用谓词
如果需要多次查询不同站点和线路,可以封装一个更直观的谓词:
station_in_line(Station, Line) :- linea(Line, Sites), member(Station, Sites).
之后直接用这个谓词查询:
station_in_line(mixcoac, 12).
内容的提问来源于stack exchange,提问作者Joel Giroud
相关产品推荐
相关产品推荐

