Выбор всех возможных вариантов из списка в прологе - PullRequest
0 голосов
/ 01 декабря 2011

Поэтому я должен написать различные процедуры, которые помогут мне решить загадку фермер-волк-козел-капуста-удобрение. Для тех из вас, кто этого не знает, фермеру приходится перебираться с северного берега реки на южный берег со всеми остальными объектами. Банк становится безопасным в 3 ситуациях: фермер присутствует ИЛИ, волк не остался с козлом ИЛИ, коза не осталась с капустой. Для целей упражнения переменными будут [f, b, g, w, c].

Процедура (выберите (Банк, Предметы)), в которой я застрял, включает в себя поиск списка из 1 или 2 элементов (всегда включая фермера - f), которые могут быть частью транспортировки из Банка, не оставляя его в безопасности.

Если кто-то выберет ([g, f, b], Items), возможные возвращаемые значения для Items могут быть [f], [f, g], [f, b]. Однако, если мы выберем ([g, f, c], Items), единственные возможные возвращаемые значения - это [f, c] или [f, g], поскольку козу и капусту нельзя оставлять вместе.

Таким образом, может ли кто-нибудь дать мне подсказку, как получить все возможные варианты для предметов, но в списках не более 2 предметов?

1 Ответ

1 голос
/ 01 декабря 2011

Я не могу сейчас тестировать, но думаю, вы могли бы написать что-то вроде:

choose(Bank, [f, Other]) :-
    select(f, Bank, Rest),
    select(Other, Rest, LeftBehind),
    safe(LeftBehind).
choose(Bank, [f]) :-
    select(f, Bank, LeftBehind),
    safe(LeftBehind).
...