2016-11-20 9 views
1

Я создал функцию, которая вычисляет длину списка. Ниже мой код.Аргументы Prolog недостаточно инстанцируются (функция, которая вычисляет длину списка)

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH). 
solve([], _). 
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

При запуске этот код с входом

- listLength ([1, 2, 3, 4, 5, 6, 7]).

тогда, переводчик показал мне сообщение об ошибке solve/2 : Arguments are not sufficiently instantiated.

, когда я изменил выше кода, как показано ниже.

listLength(LIST) :- LENGTH is 0, solve(LIST, LENGTH), write(LENGTH). 
solve([], _). 
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

Когда я запускаю этот код с тем же входом, то всегда написано.

Я хочу рассчитать LENGTH, и я хочу использовать переменную в функции listLength.

Что случилось со мной? (Пожалуйста, обратите внимание, что я использую swi-пролог.)

ответ

0

Первая ошибка в базовом корпусе. Вместо solve([], _). вы должны написать solve([], 0)., потому что, если вы не знаете длину пустого списка, как вы найдете рекурсивно для больших списков.

Существует также еще одна проблема в:

solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

при попытке вычислить добавляемый ДЛИНА + длина 1 не инстанцирован рассчитанным. Вы должны изменить порядок, как:

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH). 
solve([], 0). 
solve([_|T], LENGTH) :- solve(T, ADD), LENGTH is ADD+ 1. 

Теперь запрашивая:

?- listLength([1, 2, 3, 4, 5, 6, 7]). 
7 
true. 
+0

Это очень медленно для запросов, таких как 'listLength (L, 10000)' – false

+0

Как вы могли бы запросить, что, поскольку он принимает только один список параметров ?? – coder

+1

Вы правы! Я видел только дополнение в конце. Должен прочитать 'solve (L, 100000', я признаю, что этого не произойдет. – false