Пролог "рекурсивный" запрос - PullRequest
0 голосов
/ 30 апреля 2018

Я недавно начал изучать Пролог и столкнулся с проблемой.

Некоторые люди сидят за столом. Нам дан факт sits_right_of(X, Y) (X сидит справа от Y). Тогда я написал следующие правила:

  • sits_left_of(X, Y) :- sits_right_of(Y, X) (X сидит слева от Y);
  • are_neighbors_of(X, Y, Z) :- sits_left_of(X, Z) (X сидит слева от Z, а Y сидит справа от Z);
  • next_to_each_other(X, Y) :- are_neighbors_of(_, X, Y); are_neighbors_of(X, _, Y) (X сидит рядом с Y).

Как я могу узнать, кто тот человек, который сидит в двух местах справа (или слева) от данного человека? Есть ли какой-нибудь рекурсивный запрос типа sits_right_of(sits_right_of(X, alex))? Нужно ли мне писать еще одно правило, чтобы узнать, кто сидит на расстоянии n мест от кого-либо?

1 Ответ

0 голосов
/ 30 апреля 2018

Вы получаете значения из процедуры так же, как вводите их. Введите новую переменную и попробуйте удовлетворить sits_right_of(Y, alex). Тогда это также должно быть удовлетворено: sits_right_of(X, Y). Процедура может быть определена так:

sits_two_places_right_of(X, Y) :- sits_right_of(X, Z), sits_right_of(Z, Y).

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

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