如果我有struct_name(a, b, c, d, e).
,我怎样才能获得结构的名称?在这种情况下,它将是struct_name
。
是否有任何特定命令可以执行此操作,或者我应该在列表中以某种方式对其进行转换(我尝试过atom_chars
无效)并找到保存字符直到遇到(
?
答案 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.