将列表转换为functor参数

时间:2011-02-19 04:47:36

标签: prolog

我陷入了实施逻辑的困境。在我的程序中的某些实例中,我有一个名为List的列表。 这个列表的长度是可变的,我不知道提前。现在我必须在仿函数中传递此列表以创建事实,我无法实现它。例如:

如果列表为[first],则应添加事实functor(first).
如果列表为[first,second],则应添加事实functor(first,second).
如果列表为[first,second,third],则应添加事实functor(first,second,third).
等等...

我在=..尝试,但在这里我无法映射该可变长度约束。对于固定长度,我能够执行,但我事先并不知道列表中有多少元素。

任何实施此逻辑的建议。感谢。

1 个答案:

答案 0 :(得分:5)

我对=..的问题不太了解,但这对我有用:

 assert_list(List) :-
            Term =.. [my_functor|List],
            assert(Term).

请注意,我使用的是my_functor,而不仅仅是functor,因为functor/3是内置谓词,因此您无法断言三元functor个事实(functor(first, second, third)

致电:

 ?- assert_list([first,second,third]).
 true.

检查它是否有效:

 ?- listing(my_functor).
 :- dynamic user:my_functor/3.

 user:my_functor(first, second, third).

 true.

请注意,从技术上讲,不同的n-ary my_functor/n谓词不是相同的谓词。您必须在程序中为每个n使用不同的查询。为了避免这种情况,您可以简单地将列表断言为my_functor

的唯一参数
 ?- List = [first, second, third],
 assert(my_functor(List)).
 true.

 ?- listing(my_functor).
 :- dynamic user:my_functor/3.

 user:my_functor([first, second, third]).

 true.

我的SWI-Prolog版本是5.7.5。