将列表转换为functor参数

ani*_*ebs 2 prolog

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

如果List是[first]那么它应该添加事实functor(first).
如果List是[first,second]那么它应该添加事实functor(first,second).
如果List是[first,second,third]那么它应该添加事实functor(first,second,third).
等等......

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

任何实现此逻辑的建议.谢谢.

Fel*_*bek 5

我不太明白你的问题,=..但这对我有用:

 assert_list(List) :-
            Term =.. [my_functor|List],
            assert(Term).
Run Code Online (Sandbox Code Playgroud)

请注意,我使用my_functor而不仅仅是functor因为它functor/3是一个内置的谓词,所以你不能断言三元functor事实(functor(first, second, third)).

打电话给:

 ?- assert_list([first,second,third]).
 true.
Run Code Online (Sandbox Code Playgroud)

检查它是否有效:

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

 user:my_functor(first, second, third).

 true.
Run Code Online (Sandbox Code Playgroud)

请注意,从技术上讲,不同的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.
Run Code Online (Sandbox Code Playgroud)

我的SWI-Prolog版本是5.7.5.