Круговой Пролог - PullRequest
       5

Круговой Пролог

2 голосов
/ 06 февраля 2012

У меня есть следующий пролог-код:

equiAngularTriangle(T) :-
    equiLateralTriangle(T).

equiLateralTriangle(T) :-
    equiAngularTriangle(T).

Есть ли способ не дать переводчику задать один и тот же вопрос дважды? Например, если я спрашиваю equiAngularTriangle(t), то он спросит equiLateralTriangle(t), а затем спросит equiLateralTriangle(t), но он должен знать, что не следует повторять этот последний, потому что тот же вопрос находится в «стеке запросов».

Есть ли опция или какой-то особый синтаксис, который позволяет Прологу вести себя так, как я хочу?

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Если реализация пролога поддерживает табулирование или вы используете XSB, вы можете использовать его и получить желаемое поведение.

Вы также можете добавить аргумент состояния:

%State = [Checked_for_equiAngular, Checked_for_equiLateral]

equiAngularTriangle(T, [_,false]) :-
    equiLateralTriangle(T, [true,true]).

equiLateralTriangle(T, [false,_]) :-
    equiAngularTriangle(T, [true,true]).

конечновам нужно будет изменить остальные пункты.

Последний (и лучший imo) вариант - переписать ваши предикаты.Я предполагаю, что ваш код будет похож на этот пример:

ang(T):-
  foo(T).
ang(T):-
  lat(T).

lat(T):-
  bar(T).
lat(T):-
  ang(T).

, поэтому вы можете просто написать:

ang(T):-
  foo(T).
ang(T):-
  bar(T).

lat(T):-
  ang(T).

обычно вы будете использовать некоторые предикаты-обертки, если вместо foo (T)у вас был foo1 (T), foo2 (T) и т. д.

1 голос
/ 07 февраля 2012

Попробуйте XSB Prolog .Он реализует табулирование, которое приведет к короткому замыканию, как в вашем случае.Вы должны сказать ему, какие предикаты должны быть представлены, хотя.

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