Пролог: рекурсивная задача с вычисленным конечным условием - PullRequest
0 голосов
/ 11 апреля 2011

Я пытаюсь смоделировать набор зубчатых колес в Прологе. И запросить, если два колеса соединены цепью других.

У меня есть простая рекурсия:

connected(X,Y) :-   
    engages(X,Y).

connected(X,Y) :-
    engages(X,Z),
    connected(Z,Y).

Если я определяю взаимодействия в терминах предиката:

engages(X,Y) :- touches(X,Y).

и

touches(z1,z2).
touches(z2,z3).
touches(z3,z4).

Тогда это работает.

Тест

connected(z1,z4).

производит истину и

connected(z1,z5).

производит ложь.

Однако, если я заменю свой предикат касаний вычислением (что сумма двух радиусов примерно равна расстоянию между двумя центрами), тогда этот поиск переходит к тому, что выглядит как бесконечная рекурсия (переполнение стека), когда ответ должно быть ложным.

Почему это должно быть, учитывая, что мои вычисления "касаний" сами по себе не называют "подключенным" функтором? Это потому, что функтор touch будет пытаться сопоставить больше атомов, чем явные предикаты?

Это, примерно, мои расчетные касания (A и B - колеса, ARAD и BRAD - их радиусы, D - расстояние, а прибл. - функция "приблизительно равно").

touches(A,B) :- 
    wheel(A,_,_,ARAD),
    wheel(B,_,_,BRAD),
    distance(A,B,D),
    approx(D,(ARAD+BRAD),2),
    A \== B.

1 Ответ

3 голосов
/ 11 апреля 2011

Бесконечная рекурсия происходит потому, что программа не проверяет циклы.Вот что может произойти:

  1. Программа находит колеса A и B, которые касаются.
  2. Учитывая B, она ищет колесо, которое касается.Он находит A.
  3. Перейти к 1.

Вы можете помешать этому поддерживать "закрытый набор" колес, уже рассмотренный в дополнительном аргументе для connected:

connected(X,Y) :-
    connected(X,Y,[]).
connected(X,Y,Closed) :-
    touches(X,Y),
    \+ memberchk(Y,Closed).
connected(X,Z,Closed) :-
    touches(X,Y),
    \+ memberchk(Y,Closed),
    connected(Y,Z,[Y|Closed]).

(Упражнение для читателя: сократите это.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...