我陷入了实施逻辑的困境.在我的程序中的某些实例中,我有一个名为List的列表.这个列表的长度是可变的,我不知道提前.现在我必须在仿函数中传递此列表以创建事实,我无法实现它.例如:
如果List是[first]那么它应该添加事实functor(first).
如果List是[first,second]那么它应该添加事实functor(first,second).
如果List是[first,second,third]那么它应该添加事实functor(first,second,third).
等等......
我试过,=..但在这里,我无法映射该可变长度约束.对于固定长度,我能够执行,但我事先并不知道列表中有多少元素.
任何实现此逻辑的建议.谢谢.
我不太明白你的问题,=..但这对我有用:
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.