关于SWI-Prolog中member谓词返回结果异常的技术咨询
问题原因及解决办法
你遇到的情况要么是对Prolog的返回结果理解反了,要么是参数顺序完全搞反了,这两种都是新手入门时的常见操作误区:
误区1:混淆了Prolog的结果含义
标准Prolog中,查询成功时会返回yes(或true,依环境不同),表示谓词成立;查询失败时返回no(或false),表示谓词不成立。
- 如果你执行
member(2, [2,4,3,5])时,Prolog返回yes,这实际就是你预期的True,但你可能误把yes当成了False; - 执行
member(6, [2,4,3,5])时返回no,这实际是你预期的False,但你误把no当成了True。
误区2:参数顺序写反
标准member/2谓词的正确格式是member(要查找的元素, 目标列表)。如果你不小心把参数写反(比如写成member([2,4,3,5], 2)),结果就会完全不符合预期:
member([2,4,3,5], 6)会失败(返回no),但你可能误以为自己写的是member(6, [2,4,3,5]);member([2,4,3,5], 2)也会失败(因为列表不是元素2的成员,2是原子不是列表),所以返回no,这和你描述的member(2, ...)返回False的情况一致。
验证方法
你可以直接在Prolog环境中执行以下标准查询,对比结果:
% 应该返回yes/true,因为2是列表的元素 member(2, [2,4,3,5]). % 应该返回no/false,因为6不在列表中 member(6, [2,4,3,5]).
内容的提问来源于stack exchange,提问作者Worldy
相关产品推荐
相关产品推荐

