2015-11-21 3 views
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). 
+1

Ваш 'knelyg' запрос не потому, что он изначально унифицирует' K = 0 ', а затем запрашивает 'известково (S, K)'. Если 'calc (S, K)' пытается унифицировать 'K' с чем-то другим, кроме 0, он не сработает. Если вам нужно начать с некоторого значения, один из способов - передать его в качестве дополнительного аргумента, такого как 'calc (S, K0, K)' где 'K0' является стартовым значением. Или, из 'knelyg', вы можете напрямую запросить' calc (S, 0, K) '. – lurker

+1

Есть еще несколько вопросов. Например, в '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

+0

@ lurker - вы оказали огромную помощь. Благодарю. – WheelPot

ответ

1

держать его просто ... может быть

knelyg([],0). % missing base case 
knelyg([First|Tail],K):- 
    knelyg(Tail,K1), 
    K is K1+(First rem 2). 
Смежные вопросы