makeList(N, Item, List)
给定(非负)整数N
和项目Item
,将构造List
个元素的列表N
,每个元素{ {1}}。例如,Item
应该返回makeList(5, a, List)
。
List = [a,a,a,a,a]
答案 0 :(得分:3)
欢迎来到Prolog!你真的很亲密!您的代码中有两个问题。首先是N>1
将在1上失败,但其他make_List(0, ...
子句中1不会成功。您是说N >= 1
。
您的第二个问题是,您在将列表传递到递归步骤时正在修改列表,但是您没有办法将其从最内层撤回。相反,您需要做的是在 out 方式中对其进行修改,方法是更改:-
左侧的参数,如下所示:
make_List(0, Item, []).
make_List(N, Item, [Item|List]) :- N>=1, N1 is N-1, make_List(N1, Item, List).
将来,要帮助发现此类问题,请尝试使用trace, make_List(5, a, X).
调用代码。您将在输出中看到一些步骤,这些步骤可以帮助您解决其中的一些问题-至少N> 1这样很容易发现问题。
答案 1 :(得分:2)
执行此操作的简单方法是声明列表具有该长度,并且每个元素与您的商品统一:
makeList(N, Item, List) :-
length(List, N),
maplist(=(Item), List).
在这里是SWI-Prolog:
$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.10-56-g1631e38f2-DIRTY)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit http://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- [user].
|: makeList(N, Item, List) :-
|: length(List, N),
|: maplist(=(Item), List).
|: ^D% user://1 compiled 0.00 sec, 1 clauses
true.
?- makeList(5, a, List).
List = [a, a, a, a, a].
以及GNU-Prolog:
$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Jul 15 2018, 03:47:56 with gcc
By Daniel Diaz
Copyright (C) 1999-2018 Daniel Diaz
| ?- [user].
compiling user for byte code...
makeList(N, Item, List) :-
length(List, N),
maplist(=(Item), List).
user compiled, 3 lines read - 450 bytes written, 9422 ms
(5 ms) yes
| ?- makeList(5, a, List).
List = [a,a,a,a,a]
yes