SWI Prolog列表底层实现及'.'/2谓词报错问题咨询
SWI Prolog列表底层处理与'.'/2谓词报错问题解答
底层列表表示
SWI Prolog对列表的内部表示和传统Prolog规范存在差异,通过display/1可直接观察到其底层结构:
?- display([1,2,3]). '[|]'(1,'[|]'(2,'[|]'(3,[])))
这里的'[|]'/2才是SWI Prolog用来构造列表的核心谓词,而非传统文献中提到的'.'/2。
报错原因分析
你尝试用'.'/2构造列表时出现报错,核心原因是SWI Prolog中,.已被复用为字典访问运算符,不再承担列表构造的功能:
- 报错提示里的
'.'/3是字典相关谓词(用于访问字典键值),和列表构造完全无关 - 直接书写
.(a,[])时,SWI会将其解析为字典访问语法,因此抛出"期望字典,却得到原子a"的类型错误
以下是你遇到的报错代码及对应说明:
?- '.'(a,[]). ERROR: Unknown procedure: ('.')/2 ERROR: However, there are definitions for: ERROR: ('.')/3 false. ?- .(a,[]). ERROR: Unknown procedure: ('.')/2 ERROR: However, there are definitions for: ERROR: ('.')/3 false. ?- .(a,[]) == [a]. ERROR: Type error: `dict' expected, found `a' (an atom)
正确的列表构造方式
在SWI Prolog中,构造列表有两种等价的正确方式:
- 使用标准列表语法:
?- [a] == [a|[]]. true.
- 使用内部的
'[|]'/2谓词:
?- '[|]'(a,[]) == [a]. true.
内容的提问来源于stack exchange,提问作者Raffael
相关产品推荐
相关产品推荐

