清单包含相同的项目

时间:2019-08-01 04:57:25

标签: prolog

makeList(N, Item, List)给定(非负)整数N和项目Item,将构造List个元素的列表N,每个元素{ {1}}。例如,Item应该返回makeList(5, a, List)

List = [a,a,a,a,a]

2 个答案:

答案 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