2015-03-18 3 views
1

Я хочу создать список, состоящий из N элементов. я пишу следующий код:Пролог. Не создает список

DOMAINS 
    list = integer* 
PREDICATES 
    create(integer, integer, list) 
CLAUSES 
    create(_, 0, []). 

    create(Start, End, [Start|T]):- 
     Start < End + 1,!, 
     Counter = Start + 1, 
     create(Counter, End, T). 
GOAL 
    create(1, 5, L). 

Но он возвращает мне No Solution.

С другой стороны, если изменить направление моей Counter так:

DOMAINS 
    list = integer* 
PREDICATES 
    create(integer,list) 
CLAUSES 
    create(0,[]). 

    create(N,[N|T]):- 
     N > 0, 
     NN = N - 1, 
     create(NN,T). 
GOAL 
    create(5,L). 

возвращает мне 1 Решение: L=[5,4,3,2,1]. Он работает хорошо, но не в порядке. Что случилось в моем первом варианте кода?

ответ

1

Вам необходимо внести некоторые коррективы в вашу программу:

  1. Предложение остановки никогда не унифицированы, потому что вы не декремент Срок действия.
  2. Счетчик необходимо оценить в выражении Start + 1, поэтому используйте оператор is/2.
  3. Вам не нужно вырезать второе предложение, но на первом.

Программа:

create(X, X, [X]):- !. 
create(Start, End, [Start|T]):- 
     Start =\= End, 
     Counter is Start + 1, 
     create(Counter, End, T). 

Consult (Вам нужен список инстанциируемый, поэтому использовать переменную вместо пустого списка)

?- create(1,5, L). 
L = [1, 2, 3, 4, 5]. 
1

В первом варианте базовый случай является неправильным:

create(_, 0, []). 

Здесь End аргумент 0, но ваш не-щелочное правило никогда не модифицируя End, он работает на Start. Таким образом, ваш базовый случай должен соответствовать каждый раз, когда Start равно End:

create(E, E, []). 

 Смежные вопросы

  • Нет связанных вопросов^_^