一次添加一个列表中的元素

时间:2014-11-25 12:03:41

标签: prolog

我想创建一个空列表,然后以某种方式一次添加一个元素。

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**

我该怎么做?

1 个答案:

答案 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,例如。