Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog-检查列表的自定义运算符_List_Prolog - Fatal编程技术网

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.