Как вернуть одно значение для операции "Пролог" или "? - PullRequest
0 голосов
/ 02 июня 2018

У меня есть следующие правила в моем коде:

in(rome, lacio).
in(lacio, italy).
in(salvador, bahia).
in(bahia, brazil).

is_in(X, Z) :- (in(X, Y), in(Y, Z)) ; in(X, Z).

Так что, если я спрошу is_in(rome, lacio)., он вернет true, что ожидается, но если я спрошу is_in(rome, italy)., он вернется true, а затем false, вероятно, из-за второго слагаемого в is_in/2.

Что я должен сделать, чтобы запретить ему возвращать два результата и вместо этого возвращать только true, как в обычном "или "операция"?Я хоть ";"позаботится об этом, но это не сработало, как я ожидал.

1 Ответ

0 голосов
/ 03 июня 2018

Лучше всего по частям:

is_in(X, Z) :- in(X, Z), !, true.
is_in(X, Z) :- in(X, Y), in(Y, Z).

Но вы также можете сделать это с помощью или:

is_in(X, Z) :- in(X, Z), !, true; in(X, Y), in (Y, Z).

Дополнительный компонент, который я добавил, предотвращает ветвление Пролога из этого выбора.-точка и возвращает истину, потому что в этом случае это так.Однако будьте осторожны при выполнении подобных действий, это может вызвать проблемы в больших программах.

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