Пролог: Глава списка переменных не создается

Я пишу простой код, генерирующий простой список из 5 чисел, чья первая переменная должна быть положительной, и я пытаюсь понять, почему этот код не работает

test([H|T]) :- H > 0, length(T,4).

когда я звоню с

 length(X,5), test(X).

это показывает мне следующую ошибку:

ОШИБКА: Аргументы недостаточно проработаны

Когда я отлаживаю код, H переменная в test не создан

Кто-нибудь знает почему?

1 ответ

Решение

Проблема в том, что ваше правило для test([H|T]) не описывает в Прологе, что H является положительным целым числом. Это только тесты, если H > 0, который терпит неудачу, так как H не имеет реализации. Просто пытаюсь сравнить неопознанную переменную с числом (H > 0 в этом случае) не заставляет Пролог предполагать, что вы намеревались H быть числом, а дальше, не создавать H,

Далее ваше правило для test/1 не описывает остальную часть списка (T) кроме того, чтобы принудительно установить его длину 4. Поскольку ваш запрос устанавливает правило, согласно которому длина исходного списка равна 5, это условие является избыточным.

Вы, кажется, хотите определить test(L) так что это значит L произвольный список натуральных чисел Обычно это делается с помощью CLP(FD):

:- use_module(library(clpfd)).

test(X) :- X ins 1..10000.

Это правило гласит, что X список, значения которого находятся в диапазоне от 1 до 10000. Соответствующим запросом для создания списков длиной 5 будет:

?- length(X, 5), test(X), label(X).
X = [1, 1, 1, 1, 1] ;
X = [1, 1, 1, 1, 2] ;
X = [1, 1, 1, 1, 3] ;
X = [1, 1, 1, 1, 4] ;
X = [1, 1, 1, 1, 5] ;
...

Если вы хотите еще больше ограничить его и сказать, что элементы должны быть уникальными, вы можете использовать all_different/1:

test(X) :- X ins 1..10000, all_different(X).

?- length(X, 5), test(X), label(X).
X = [1, 2, 3, 4, 5] ;
X = [1, 2, 3, 4, 6] ;
X = [1, 2, 3, 4, 7] ;
X = [1, 2, 3, 4, 8] ;
X = [1, 2, 3, 4, 9] ;
X = [1, 2, 3, 4, 10] ;
...
Другие вопросы по тегам