如何获取结构名称?

How to get structure name?

如果我有struct_name(a, b, c, d, e).,我怎样才能得到结构的名字?在这种情况下,它将是 struct_name

是否有任何特定的命令可以执行此操作,或者我是否应该以某种方式在列表中转换它(我试过但 atom_chars 不起作用)并找到保存字符直到遇到 (

您可以使用 (=..)/2 谓词(这是一个 ISO 谓词,所以它应该适用于(几乎)所有 Prolog 解释器),它在左侧有一个函子,在右侧有仿函数的名称后跟其操作数。

所以:

?- struct_name(a, b, c, d, e) =.. L.
L = [struct_name, a, b, c, d, e].

因此您可以获得结构的名称:

get_name(A,N) :-
    A =.. [N|_].

当你用 struct_name(a, b, c, d, e) 调用它时,它会给你:

?- get_name(struct_name(a, b, c, d, e),N).
N = struct_name.

一种解决方案是使用 functor/3.

示例:

?- Term = struct_name(a, b, c, d, e),
   functor(Term, F, Arity).
Term = struct_name(a, b, c, d, e),
F = struct_name,
Arity = 5.

相关术语检查谓词是 arg/3(=..)/2

使用此类谓词通常表明您的数据结构设计存在问题,并且通常会严重限制关系的通用性

请特别注意,只有当它们的参数已充分实例化时,您才能使用它们。

例如:

?- functor(Term, F, A).
ERROR: Arguments are not sufficiently instantiated

这意味着您不能再使用此类谓词来生成 答案。