1

我想build/3在 Prolog 中列出N一个元素列表,每个元素都应该是X.

?- build(30,3,L).  
L = [30,30,30].  

在它上面花了好几个小时,一直以无限循环结束,或者变量没有正确实例化。

build(_,0,[]).  
build(X,N1,[X]):- N1>0, N1 is N - 1, build(X,N,[]).  
build(X,N1,[X|L]) :- N1 > 0, N1 is N - 1, build(X,N,L).  
4

2 回答 2

8

使用元谓词使其非常简短:

(1) with maplist/2: 创建一个长度为 N 的列表,然后将其所有元素与 X 匹配。

build(X, N, List)  :- 
    length(List, N), 
    maplist(=(X), List).

(2) with findall/3: 循环 N 次并用 X N 次完成 List

build(X, N, List)  :- 
    findall(X, between(1, N, _), List).
于 2015-04-25T12:08:22.230 回答
5
build(_,0,[]).         % any value, repeated 0 times, makes for an empty list

好的。

build(X,N1,[X|L]) :-   % a value X, repeated N1 times, makes for [X|L] list, _if_ ...
  N1 > 0, N1 is N - 1,    %  N1 is positive, and L is
  build(X,N,L).           %  one element shorter... right?

出色的。嗯?N is N1 - 1你的意思是。

build(X,N1,[X]):- N1>0, N1 is N - 1, build(X,N,[]).  

为什么??[X]已经被上一条规则匹配,[X] = [X | [] ] = [X | L]空列表L = []将被第一条规则匹配。

你根本不需要这条规则。

于 2013-05-07T20:13:38.787 回答