Ваша проблема в том, что при таких арифметических вычислениях:
A is B
все на правой стороне (B) должно быть уже известно. Никаких переменных нет.
Вы можете сделать что-то вроде этого:
not_number(X, Y) :- not_number(X, Y, 0).
not_number([], Y, Y).
not_number([H|T], Y, Z) :-
\+ (number(H)),
Z1 is Z+1,
not_number(T, Y, Z1).
not_number([H|T], Y, Z) :-
number(H),
not_number(T, Y, Z).
(протестировал этот код сейчас, он работает).
Теперь третий аргумент - аккумулятор. Он считает, сколько существует не-чисел. Когда список пуст, этот третий аргумент объединяется со вторым и становится правильным ответом.
Пролог, если ему представится такая возможность, пойдет по всем возможным маршрутам. Если вы сделаете что-то вроде этого:
cat(adam).
cat(eve).
а потом спросите:
?- cat(X).
Вы могли получить оба ответа: Х = Адам и Х = Ева. Это применимо и к вашему коду: обратите внимание, что если заголовок списка не является числом, вы все равно можете сделать это:
not_number([_|Tail],Result):-
not_number(Tail,Result).
что дает не тот ответ, который вам хотелось бы. Вы должны отрезать маршруты, которые вас не интересуют. В этом случае я бы добавил
number(Head).
чтобы гарантировать, что мы пропустим элемент в списке без увеличения счетчика на 1, только если этот элемент не является числом.
Чтобы заставить Пролог находить другие результаты, вы должны нажать ";" на клавиатуре (как в этом примере Адама и Евы).
person
Darge Elar
schedule
22.05.2014
R1 is R+1
, когдаR
не создается в случаеnot_number([a], R)
. Ваш рекурсивный регистр немного сдвинут назад. Вы хотите сделатьnot_number(T, R1), R is R1+1
. - person lurker   schedule 23.05.2014is
- person Yibo Yang   schedule 02.04.2016