2011-02-19 52 views
2

我被卡住以实现逻辑。在我的程序中的某个实例中,我有一个名为List的列表。 这个列表的长度是可变的,我不知道提前。现在我必须通过函数来​​传递这个列表来创建一个事实,我无法实现它。对于如:将列表转换为仿函数参数

如果名单是[first]那么就应该添加的事实functor(first).
如果名单是[first,second]那么就应该添加的事实functor(first,second).
如果名单是[first,second,third]那么就应该添加的事实functor(first,second,third).
等。 ..

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

任何建议来实现这个逻辑。谢谢。

回答

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元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。