我卡在实现一个逻辑上了。在我的程序中的某些情况下,我有一个名为List的列表。这个列表的长度是可变的,我事先不知道。现在我必须在一个函数器中传递这个列表来创建一个事实,但我无法实现它。例如:
如果List为[first],则应添加事实functor(first).
如果List为[first,second],则应添加事实functor(first,second).
如果List为[first,second,third],则应添加事实functor(first,second,third).
以此类推。
我尝试使用=..,但在这里我无法映射可变长度约束。对于固定长度,我可以执行,但我不知道列表中会有多少元素。
实现此逻辑的任何建议。谢谢。
发布于 2011-02-19 21:35:28
我不太理解你对=..的问题,但这对我很有效:
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元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。
https://stackoverflow.com/questions/5048912
复制相似问题