Загадка Эйнштейна

Я новичок в Prolog, и я пытаюсь смоделировать загадку, как загадка Эйнштейна, также известную как загадка Zebra (но с 10 домами и 30 подсказками) в Prolog, и я использую этот пример модели как отправная точка:

http://www.baptiste-wicht.com/2010/09/solve-einsteins-riddle-using-prolog/

Но в моей загадке я должен быть в состоянии сказать, что X прав Y. И я не имею в виду прямое право, но право в списке. Так что Y может быть в доме 1, а X в доме 9.

Как я могу сделать это в Prolog? Я думал о предикате, который говорит, что Y является членом списка, построенного путем принятия X и всех элементов до X из этого списка, но я не уверен, как это сделать или сделать так, чтобы я мог поместить его в предыдущий пример.

Ответ 1

right (X, Y): - правый (X, Z), правый (Z, Y).

Следовательно, вы просто используете транзитивное замыкание для определения правильного предиката, а затем определяете элементы, которые находятся непосредственно рядом друг с другом.