Ошибка free variable in expression - Prolog

Узнай цену своей работы

Формулировка задачи:

Задача: Разбить строчный список на 2 списка. Мое решение:
Листинг программы
  1. domains
  2. length = integer
  3. list = symbol *
  4. predicates
  5. split( length, list, list, list )
  6. count( list, length )
  7. clauses
  8. count( [], 0 ).
  9. count( [_|T], L ) :-
  10. count( T, L1 ),
  11. L = L1 + 1.
  12. split( X, [H|T], [_|L1], L2 ) :- count( [H|T], Length ),
  13. Length / 2 > X,
  14. L1 = T,
  15. split( X1, [H|T], L1, L2 ),
  16. X = X1 + 1.
  17. split( 0, [], [], [] ).
  18. GOAL
  19. split( X, ["s", "b", "r", "r"], L1, L2),
  20. write(L1).
Но Turbo Prolog ругается на 13 строке ( Length / 2 > X ), "free variable in expression". Можете подсказать, почему ругается, вроде все нормально.

Решение задачи: «Ошибка free variable in expression»

textual
Листинг программы
  1. split_at(0, L, [], L).
  2. split_at(N, [H|T], [H|T1], L2) :-
  3.     NN = N - 1,
  4.     split_at(NN, T, T1, L2).
  5.  
  6. split(L, L1, L2) :-
  7.     count(L, K),
  8.     N = K/2,
  9.     split_at(N, L, L1, L2).

Объяснение кода листинга программы

В данном коде реализованы две процедуры для разделения списка на две части:

  1. split_at(N, L, L1, L2) - разделяет список L на две части, помещая элементы с индексами от 0 до N-1 в L1, а остальные элементы (с N и далее) - в L2. Если N=0, то L1 становится пустым списком, а L2 - исходным списком без изменений.
  2. split(L, L1, L2) - разделяет список L на две равные части (по half элементов в каждой), помещая элементы первой части в L1, а элементы второй части - в L2. Если список L нечетной длины, то L1 становится списком из первого N элементов, а L2 - списком из оставшегося одного элемента. Пример использования: ?- split([1,2,3,4,5], L1, L2). L1 = [1, 2], L2 = [3, 4, 5]. ?- split([1,2,3,4,5,6], L1, L2). L1 = [1, 2, 3], L2 = [4, 5, 6]. ?- split([1,2,3,4,5,6,7], L1, L2). L1 = [1, 2, 3, 4], L2 = [5, 6, 7]. ?- split([1,2,3,4,5,6,7,8], L1, L2). L1 = [1, 2, 3, 4, 5], L2 = [6, 7, 8]. ?- split([1,2,3,4,5,6,7,8,9], L1, L2). L1 = [1, 2, 3, 4, 5], L2 = [6, 7, 8, 9].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы