List Prolog-检查列表的自定义运算符
我正在编写一些教程,目前仍停留在这方面:List Prolog-检查列表的自定义运算符,list,prolog,List,Prolog,我正在编写一些教程,目前仍停留在这方面: isSingleton运算符是一元前缀运算符,用于检查其列表操作数是否只有一个元素 例如: ?- isSingleton []. false. ?- isSingleton [-8]. true. 如何生成检查列表是否包含一个变量的运算符?基本语法 发出上述查询将F与'统一起来。与A与2统一起来。 因此,列表是由二进制术语(Head,Tail)表示的典型列表,其中Head是一个元素,Tail是一个子列表。我们还可以使用谓词来分解列表: [1,2,3]
isSingleton
运算符是一元前缀运算符,用于检查其列表操作数是否只有一个元素
例如:
?- isSingleton [].
false.
?- isSingleton [-8].
true.
如何生成检查列表是否包含一个变量的运算符?基本语法
发出上述查询将F
与'统一起来。
与A
与2统一起来。
因此,列表是由二进制术语(Head,Tail)
表示的典型列表,其中Head
是一个元素,Tail
是一个子列表。我们还可以使用谓词来分解列表:
[1,2,3] =.. X.
上面的X
与[、1、[2、3]]
不匹配。如果我们在单例列表上应用相同的方法,我们得到的结果如下:
[1] =.. X.
X = [., 1, []]
Yes.
空列表表示为[]
,它是一个名为“[]”
的原子。
了解以上所有内容后,我们可以仅使用基本的Prolog dot术语生成列表:
.(A,.(B,[])) = [A,B].
Yes
语法糖
如上所述,括号表示法是/2
的语法糖,并且
[H1, …, Hn | T ]
…代表
.(H1,( … .(Hn, T) … ))
特别是当T
是空列表[]
时,可以省略“|T
”。这就是为什么可以编写[a,b,c]
来表示(a,.(b,.(c,[]))
列表的原因
独生子女
包含元素V
的单例列表由[V]
表示,它代表(V,[])
。在您的评论中,您做得对的是操作员声明:
:- op(500, fy, isSingleton).
您添加了一个无用的带有空尾的“|[]
”cons,但这里失败的原因是没有定义这样的谓词。当然,您可以将其写入文件并加载,但由于您只需要一个简单子句,因此也可以使用compile\u term/1
:
compile_term(isSingleton([_])).
根据定义,isSingleton
成功的条件是且仅当其第一个参数可以与尾部为空的列表统一。我们不关心它的头部,这解释了匿名\uux
变量(您原来的\ux
添加的信息很少,但也是正确的)。最后,进行了以下工作:
isSingleton [3].
Yes.
你能在序言中描述一个元素的列表是什么样的吗?我设法得到了它,答案是::-op(500,fy,isSingleton)。伊辛格尔顿,没错。您可以简化它一点,因为
[\ux]
与[\ux]
相同,因为[\ux]
意味着它有一个空尾巴。或者,在这种情况下,您甚至可以使用[\u]
,因此就是单例[\u].
。术语[\u]
是一个匿名的单元素列表。哪个系统说A=ab=B
??@false ECLiPSe()。如果你担心输出是无用的,我同意。SWI Prolog没有打印它,我认为没有必要在答案中保留它。显示A
和B
有一定的意义:它坚持认为解决方案集包含A
和B
的所有术语。这在某种程度上比说true
更准确。另一方面,true
(来自例如SWI)必须在实际查询的变量中看到w.r.t。在任何情况下,顶层都没有标准化,考虑到近年来的发展(即决定论、约束的显示),我们可以很高兴20年前它还没有标准化。感谢coredump提供详细的答案,并设法将其整理好。谢谢大家的帮助@AndrewCreevey-如果这回答了您的问题,您应该将其标记为已接受的答案,以给予回答者信任。
isSingleton [3].
Yes.