如何获得结构名称?

时间:2017-03-24 10:16:02

标签: prolog functor

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

是否有任何特定命令可以执行此操作,或者我应该在列表中以某种方式对其进行转换(我尝试过atom_chars无效)并找到保存字符直到遇到(

2 个答案:

答案 0 :(得分:3)

一种解决方案是使用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

这意味着您无法再将此类谓词用于生成答案。

答案 1 :(得分:1)

您可以使用(=..)/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.