1

build/3Prolog に要素のリストを表示したいのですが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 回完成させます。

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 に答える