Вычислить подсписок исходного списка, начинающийся с элемента с указанным номером

Рейтинг: 1Ответов: 1Опубликовано: 01.04.2015

Здравствуйте. Подскажите пожалуйста почему не работает программа, пишу на Prolog 5.2. Условие: Создайте предикат, вычисляющий по списку и числу, подсписок исходного списка, начинающийся с элемента с указанным номером.

domains
list = integer*

predicates
sublist(integer,integer,list,list)


clauses
sublist(_,_,[],[]):-!.
sublist(N,N,L,L):-!.
sublist(M,N,[H|T],T1):-
  M<N,
  M1=M+1,
  sublist(M1,N,T,T1).


goal
  write("N="), readint(N),
  write("L="), readterm(list,L),
  sublist(1,N,L,L1),write(L1),nl.

Ошибка после ввода N и L:

PROGRAM ERROR. Module:OBJ\GOAL$000.PRO Pos:831
 Message:1405 List start expected (during term reading or converting)

Заранее спасибо

Ответы

▲ 1
split(List, Number, Right):-
  PredNumber is Number - 1,  
  append(Left, Split, List),
  length(Left, PredNumber).

Суть в том, что если тебе нужна часть, начиная с N-ного элемента списка, то перед ней расположено N-1 элементов. Т.е. тебе исходный список надо разделить на первые N-1 элемент и остальные. Разделить список можно встроенным предикатом append, определить длину - length. Если пишешь на каком-нибудь Turbo Prolog, то таких встроенных предикатов нет, но можешь их найти тут: статья про списки на Prolog