2013-05-07 3 views
0

Я хочу, чтобы build/3 список в Прологе N элементов, каждый элемент должен быть X.Построение списка n длины одного значения Пролог

?- 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
build(_,0,[]). 

хорошо.

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

отличная. ?? N is N1 - 1 вы имеете в виду.

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

Почему? [X] уже соответствует предыдущему правилу, [X] = [X | [] ].

Это правило не обязательно вообще.

4

Использование мета-предикаты делает это очень коротким:

(1) с maplist/2: создает список длиной N, а затем сопоставляются все его элементы в X.

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

(2) с findall/3 : делает цикл N раз и заканчивается Список с X N-раз

build(X, N, List) :- 
    findall(X, between(1, N, _), List). 
Смежные вопросы