Prolog:从列表元素创建函数项

3

我需要将一个列表提供给谓词,并从中获取包含该列表元素的术语。

因此,我需要类似于以下内容:

turn_into_struct(+List, -Term).

我曾考虑过为列表中的每个元素递归使用nb_setarg/3,但这样我需要用特定的arity实例化术语,而我找不到如何做到这一点。


这是作业吗?如果是的话,我会避免透露太多信息 :-) - Edmund
是的,这是一道作业题,但它是一个与编程语言相关的具体问题。 - Iulius Curt
嗯,我想问题是,你是否被允许仅重用=..,还是你的作业是使用其他谓词重新创建执行相同工作的东西? - Edmund
作业变得更复杂了。你没有破坏任何东西,我可以向你保证 :) - Iulius Curt
2个回答

2
你可以先找到列表的长度,用虚拟值构建新术语,然后通过递归或回溯(例如使用findall)填充每个参数。如果需要,我可以提供更多细节(只要不破坏你自己的工作)。
length(List, Len),
functor(Struct, struct, Len),
% Fill in each argument of Struct here...

不过,使用SWI-Prolog的=..谓词有一种更简单的一行技巧。


=.. 已经起作用了,谢谢。functor 谓词也很不错。 - Iulius Curt

1
创建术语列表的典型方法是使用=..(又称“Univ”)。例如:
turn_into_struct(List, Struct) :-
    Struct =.. [structure|List].

在原问题中,“struct”的正确术语应为“term”。

(在其他答案的评论中提到了Univ,但我将其重新发布为答案,以便后人更容易看到)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接