Предикат Пролог определяется как логическое ИЛИ 2 цели? - PullRequest
3 голосов
/ 26 апреля 2011

Мне интересно, как создать в Прологе предикат, который оценивается как "истинный", если одна из его целей доказуема.

У меня есть эта программа:

adjacent(place1, place2).
distance(X, Y, 1) :-
    adjacent(X, Y) ; adjacent(Y, X).

Послеобращаясь к нему в Прологе, если я наберу:

> distance(place1, place2, 1)

Я получу этот вывод:

true;
false.

Мне интересно, есть ли способ сделать предикат расстояния, который просто возвращаетоднозначный ответ «истина», если любой из смежных (X, Y) или смежных (Y, X) доказуем.

Простите, если что-то в этом посте сбивает с толку, у меня нет лучшего пониманияПролог, но, надеюсь, этот вопрос понятен.Спасибо.

Ответы [ 2 ]

4 голосов
/ 26 апреля 2011

Вы можете использовать предикат once/1, чтобы убедиться, что нет возврата.

Оператор дизъюнкции ; предоставляет возможность возврата, поэтому Prolog будет ждать, пока вы сообщите ему, чтобы изучить любые возможные дальнейшие решения.

once определяется в терминах «сокращения» (!), которое отбрасывает любые предыдущие «точки выбора» возврата, которые могут быть. Возможно, стоит почитать на срезе.

1 голос
/ 26 апреля 2011

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

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

В этом случае вы должны использовать Cut / один раз.

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