Ошибка free variable in expression - Prolog
Формулировка задачи:
Задача: Разбить строчный список на 2 списка.
Мое решение:
Но Turbo Prolog ругается на 13 строке ( Length / 2 > X ), "free variable in expression". Можете подсказать, почему ругается, вроде все нормально.
Листинг программы
- domains
- length = integer
- list = symbol *
- predicates
- split( length, list, list, list )
- count( list, length )
- clauses
- count( [], 0 ).
- count( [_|T], L ) :-
- count( T, L1 ),
- L = L1 + 1.
- split( X, [H|T], [_|L1], L2 ) :- count( [H|T], Length ),
- Length / 2 > X,
- L1 = T,
- split( X1, [H|T], L1, L2 ),
- X = X1 + 1.
- split( 0, [], [], [] ).
- GOAL
- split( X, ["s", "b", "r", "r"], L1, L2),
- write(L1).
Решение задачи: «Ошибка free variable in expression»
textual
Листинг программы
- split_at(0, L, [], L).
- split_at(N, [H|T], [H|T1], L2) :-
- NN = N - 1,
- split_at(NN, T, T1, L2).
- split(L, L1, L2) :-
- count(L, K),
- N = K/2,
- split_at(N, L, L1, L2).
Объяснение кода листинга программы
В данном коде реализованы две процедуры для разделения списка на две части:
- split_at(N, L, L1, L2) - разделяет список L на две части, помещая элементы с индексами от 0 до N-1 в L1, а остальные элементы (с N и далее) - в L2. Если N=0, то L1 становится пустым списком, а L2 - исходным списком без изменений.
- 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].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д