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