我想创建一个空列表,然后以某种方式一次添加一个元素。
call(X):-
**Here I want to add X into a list L which was initially empty.
Everytime call(X) is called a new value of X is added to the list L**
我该怎么做?
答案 0 :(得分:1)
这是什么意思,“添加到列表”?你打算怎么用这个清单?
一种可能的方法是将列表写为事实表,每个列表元素一个事实:
add_front(X) :-
asserta(list(X)).
add_back(X) :-
assertz(list(X)).
要检索列表,您可以使用findall(X, list(X), List)
:
?- add_front(a), add_front(b), add_back(X).
true.
?- findall(X, list(X), List).
List = [b, a, _G342].
这是一个有效的解决方案,但如果您感觉不对,那么您实际上是在处理列表。此列表的值来自何处?即使它们来自用户交互,也有更好的方法来制作列表,例如:
read_list(List) :-
read(T),
( T == end_of_file
-> true
; format('~w~n', [[T|List]]),
read_list([T|List])
).
您需要记住,您的输入必须是有效的序言术语,并以点结束该行:
?- read_list([]).
|: 1.
[1]
|: b.
[b,1]
|: foo(bar).
[foo(bar),b,1]
|: X.
[_G1279,foo(bar),b,1]
......等等。当你用文件结尾打断它时它会成功。您可以访问每个输入的完整列表。
如果您从想要转换的列表开始,您应该查看maplist
,例如。