Нахождение пути между двумя списками - PullRequest
2 голосов
/ 30 октября 2011

Мне была поручена часть кода, которая считывает два списка и находит путь между этими двумя списками.

Однако у меня проблема с чтением и возвратом ИСТИННОГО случая, если я найду нужный узел в первом списке. Я пишу свой код, как показано ниже.

%declare the list
circle_line([cc1,cc2,cc3,cc4,cc5,cc6,cc7,cc8,cc9,cc10,cc11,cc12,cc13,cc14,cc15,cc16]).   

%the predicate that finds the station i need
check_for_station(A) :- circle_line(X),
            member(A,X),
            write(A),nl.

Тогда в косоле я наберу: check_for_station(cc9).

Но я получаю ответ "нет". У меня такое ощущение, что я объявляю список неверным, потому что в отладчике значение X оказывается «H135» или чем-то еще, и оно явно не проходит через каждый элемент, чтобы найти тот, который мне нужен.

1 Ответ

0 голосов
/ 31 октября 2011

Как, почему взломан найден, в Амзи!Пролог классический (и недетерминированный) предикат member / 2 не является «встроенным», но предоставляется (наряду с другими полезными предикатами манипулирования списком, такими как length / 2 ) в список библиотек .См. здесь для ознакомления с некоторыми контекстами встроенных и библиотечных предикатов для списков.

Если check_for_station / 1 вызывается только с аргументом A bound(как показывает пример), тогда встроенный (и детерминированный) предикат Amzi! is_member / 2 выполнит работу (и немного быстрее).

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

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