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.