0
Я написал программу, которая вычисляет, сколько содержит список нечетных чисел. Чтобы использовать его, введите запрос в этой форме knelyg([1,2,3],K).
. Вот моя проблема, теперь моя программа вернет false
, а не K=2
.Как «вернуть» значение в пролог?
Мой вопрос: как убедиться, что значение K будет возвращено пользователю и распечатано без использования каких-либо функций записи в самой программе?
calc(S,K):-
S = [First|Tail],
(First rem 2 =:= 0 -> calc(Tail,K); K1 is K + 1),
calc(Tail,K1).
knelyg(S,K):-
K = 0,
calc(S,K).
Ваш 'knelyg' запрос не потому, что он изначально унифицирует' K = 0 ', а затем запрашивает 'известково (S, K)'. Если 'calc (S, K)' пытается унифицировать 'K' с чем-то другим, кроме 0, он не сработает. Если вам нужно начать с некоторого значения, один из способов - передать его в качестве дополнительного аргумента, такого как 'calc (S, K0, K)' где 'K0' является стартовым значением. Или, из 'knelyg', вы можете напрямую запросить' calc (S, 0, K) '. – lurker
Есть еще несколько вопросов. Например, в 'calc (S, K)' вы начинаете с 'S = [First | Tail]', тогда имеем 'First rem 2 =: = 0'. Но 'First не создается. Таким образом, 'First rem 2 =: = 0' будет терпеть неудачу из-за неподготовленной переменной. Начните с рассмотрения двух случаев: рекурсивного случая и базового случая. Базовый регистр - пустой список: 'knelyg ([], 0) .', который говорит: * в пустом списке есть 0 нечетных элементов *. Тогда рекурсивным случаем будет: «knelyg ([First | Tail], N): - knelyg (Tail, N1), ... [наберите N здесь]'. – lurker
@ lurker - вы оказали огромную помощь. Благодарю. – WheelPot