Что не так с этим предикатом в Прологе? - PullRequest
0 голосов
/ 28 февраля 2011
        findThree([H|T],_,3).    
        findThree([H|T], M, Z):-
            ( member(H,M)
              -> Z2 is Z + 1,
              select(H,M,C),
              findThree(T,C,Z2)
              ;select(H,M,C),
              findThree(T,C,Z)
            ).

Итак, я пытаюсь увидеть, есть ли элемент в указанном списке.Если это так, я увеличиваю некоторую переменную и останавливаюсь, если нашел 3 из этих элементов.Тем не менее, это, кажется, не работает для меня - это проблема с моим синтаксисом?Я пытаюсь использовать конструкцию If-else в SWI-Prolog;может ли это быть проблемой?

1 Ответ

1 голос
/ 28 февраля 2011

Z is Z + 1 всегда будет отсутствовать для целых чисел; это вычислит значение Z + 1, а затем попытается объединить его с Z. Поскольку Z обычно не будет иметь такое же значение, как Z + 1, is завершится ошибкой. Вам нужно будет создать новую переменную Z2, использовать Z2 is Z + 1, а затем использовать Z2 вместо Z в соответствующих местах.

Взятие вашего кода и исправления:

findThree(_,_,3).  % This should allow anything as the first element

findThree([H|T], M, Z) :-
  select(H, M, C), Z2 is Z + 1, findThree(T, C, Z2). % select includes member implicitly
findThree([_|T], M, Z) :-
  findThree(T, M, Z). % Allow this second case since it simplifies the code
...