Prolog - 检查列表的自定义运算符
Prolog - custom operator to check list
我正在编写一些教程,目前卡在这个问题上:
isSingleton
运算符是一元前缀运算符,用于检查其列表操作数是否恰好有一个元素。
例如:
?- isSingleton [].
false.
?- isSingleton [-8].
true.
如何创建一个运算符来检查列表是否包含一个变量?
基本语法
functor([1,2,3],F,A).
发出上述查询将 F
与 '.'
和 A
与 2 统一。
因此,列表是典型的 cons-cell represented by a binary term .(Head,Tail)
, where Head
is an element and Tail
a sublist. We could also destructure a list with the =../2
谓词:
[1,2,3] =.. X.
以上不符合 X
和 [., 1, [2, 3]]
。如果我们在单例列表上应用相同的方法,这就是我们所拥有的:
[1] =.. X.
X = [., 1, []]
Yes.
空列表表示为[]
,这是一个名为"[]"
的原子。
了解以上所有内容,我们可以仅使用基本的 Prolog 点项生成列表:
.(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,但是isSingleton [_X|[]]
在这里失败的原因是没有定义这样的谓词。你当然可以把它写在一个文件中并加载它,但是因为你只需要一个简单的子句,你也可以使用 compile_term/1
:
compile_term(isSingleton([_])).
根据定义,isSingleton
成功当且仅当其第一个参数可以与尾部为空的列表统一时。我们不关心它的头部,它解释了匿名 _
变量(您原来的 _X
添加了很少的信息,但也是正确的)。最后是以下作品:
isSingleton [3].
Yes.
我正在编写一些教程,目前卡在这个问题上:
isSingleton
运算符是一元前缀运算符,用于检查其列表操作数是否恰好有一个元素。
例如:
?- isSingleton [].
false.
?- isSingleton [-8].
true.
如何创建一个运算符来检查列表是否包含一个变量?
基本语法
functor([1,2,3],F,A).
发出上述查询将 F
与 '.'
和 A
与 2 统一。
因此,列表是典型的 cons-cell represented by a binary term .(Head,Tail)
, where Head
is an element and Tail
a sublist. We could also destructure a list with the =../2
谓词:
[1,2,3] =.. X.
以上不符合 X
和 [., 1, [2, 3]]
。如果我们在单例列表上应用相同的方法,这就是我们所拥有的:
[1] =.. X.
X = [., 1, []]
Yes.
空列表表示为[]
,这是一个名为"[]"
的原子。
了解以上所有内容,我们可以仅使用基本的 Prolog 点项生成列表:
.(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,但是isSingleton [_X|[]]
在这里失败的原因是没有定义这样的谓词。你当然可以把它写在一个文件中并加载它,但是因为你只需要一个简单的子句,你也可以使用 compile_term/1
:
compile_term(isSingleton([_])).
根据定义,isSingleton
成功当且仅当其第一个参数可以与尾部为空的列表统一时。我们不关心它的头部,它解释了匿名 _
变量(您原来的 _X
添加了很少的信息,但也是正确的)。最后是以下作品:
isSingleton [3].
Yes.