如何获取结构名称?
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
这意味着您不能再使用此类谓词来生成 答案。
如果我有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
这意味着您不能再使用此类谓词来生成 答案。