Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Strawberry Prolog  (Прочитано 11717 раз)
0 Пользователей и 1 Гость смотрят эту тему.
blondinka62733
Гость
« : 14-05-2009 15:29 » 

Помогите исправить код... Прога работает, но не выдает полный ответ, а только Yes.

Задача:   Три миссионера и три каннибала хотят переправиться с левого берега на правый. Как это сделать за минимальное число шагов, если в их распоряжении имеется трехместная лодка и ни при каких обстоятельствах (в лодке или на берегу) миссионеры не должны оставаться в меньшинстве.
Код:
/*1 kannibal*/
move(state(X,K2,K3,M1,M2,M3),state(Y,K2,K3,M1,M2,M3)):-opposite(X,Y).
move(state(K1,X,K3,M1,M2,M3),state(K1,Y,K3,M1,M2,M3)):-opposite(X,Y).
move(state(K1,K2,X,M1,M2,M3),state(K1,K2,Y,M1,M2,M3)):-opposite(X,Y).

/*2 kannibala*/
move(state(X,X,K3,M1,M2,M3),state(Y,Y,K3,M1,M2,M3)):-opposite(X,Y).
move(state(X,K2,X,M1,M2,M3),state(Y,K2,Y,M1,M2,M3)):-opposite(X,Y).
move(state(K1,X,X,M1,M2,M3),state(K1,Y,Y,M1,M2,M3)):-opposite(X,Y).

/*3 kannibala*/
move(state(X,X,X,M1,M2,M3),state(Y,Y,Y,M1,M2,M3)):-opposite(X,Y).

/*1 missioner*/
move(state(K1,K2,K3,X,M2,M3),state(K1,K2,K3,Y,M2,M3)):-opposite(X,Y).
move(state(K1,K2,K3,M1,X,M3),state(K1,K2,K3,M1,Y,M3)):-opposite(X,Y).
move(state(K1,K2,K3,M1,M2,X),state(K1,K2,K3,M1,M2,Y)):-opposite(X,Y).

/*2 missionera*/
move(state(K1,K2,K3,X,X,M3),state(K1,K2,K3,Y,Y,M3)):-opposite(X,Y).
move(state(K1,K2,K3,M1,X,X),state(K1,K2,K3,M1,Y,Y)):-opposite(X,Y).
move(state(K1,K2,K3,X,M2,X),state(K1,K2,K3,Y,M2,Y)):-opposite(X,Y).

/*3 missionera*/
move(state(K1,K2,K3,X,X,X),state(K1,K2,K3,Y,Y,Y)):-opposite(X,Y).

/*1 kannibal, 1 missioner*/
move(state(X,K2,K3,X,M2,M3),state(Y,K2,K3,Y,M2,M3)):-opposite(X,Y).
move(state(K1,X,K3,X,M2,M3),state(K1,Y,K3,Y,M2,M3)):-opposite(X,Y).
move(state(K1,K2,X,X,M2,M3),state(K1,K2,Y,Y,M2,M3)):-opposite(X,Y).
move(state(X,K2,K3,M1,X,M3),state(Y,K2,K3,M1,Y,M3)):-opposite(X,Y).
move(state(K1,X,K3,M1,X,M3),state(K1,Y,K3,M1,Y,M3)):-opposite(X,Y).
move(state(K1,K2,X,M1,X,M3),state(K1,K2,Y,M1,Y,M3)):-opposite(X,Y).
move(state(X,K2,K3,M1,M2,X),state(Y,K2,K3,M1,M2,Y)):-opposite(X,Y).
move(state(K1,X,K3,M1,M2,X),state(K1,Y,K3,M1,M2,Y)):-opposite(X,Y).
move(state(K1,K2,X,M1,M2,X),state(K1,K2,Y,M1,M2,Y)):-opposite(X,Y).

/*1 kannibal, 2 missionera*/
move(state(X,K2,K3,X,X,M3),state(Y,K2,K3,Y,Y,M3)):-opposite(X,Y).
move(state(X,K2,K3,M1,X,X),state(Y,K2,K3,M1,Y,Y)):-opposite(X,Y).
move(state(X,K2,K3,X,M2,X),state(Y,K2,K3,Y,M2,Y)):-opposite(X,Y).
move(state(K1,X,K3,X,X,M3),state(Y,K2,K3,Y,Y,M3)):-opposite(X,Y).
move(state(K1,X,K3,M1,X,X),state(K1,Y,K3,M1,Y,Y)):-opposite(X,Y).
move(state(K1,X,K3,X,M2,X),state(K1,Y,K3,Y,M2,Y)):-opposite(X,Y).
move(state(K1,K2,X,X,X,M3),state(K1,K2,Y,Y,Y,M3)):-opposite(X,Y).
move(state(K1,K2,X,M1,X,X),state(K1,K2,Y,M1,Y,Y)):-opposite(X,Y).
move(state(K1,K2,X,X,M2,X),state(K1,K2,Y,Y,M2,Y)):-opposite(X,Y).

opposite(east,west).
opposite(west,east).

/*2 kannibala, 1 missioner*/
unsafe(state(X1,X2,X3,Y1,Y2,Y3)):-
X1 = east,X2 = east,Y1 = east;
X1 = east,X3 = east,Y1 = east;
X2 = east,X3 = east,Y1 = east;

X1 = east,X2 = east,Y2 = east;
X1 = east,X3 = east,Y2 = east;
X2 = east,X3 = east,Y2 = east;

X1 = east,X2 = east,Y3 = east;
X1 = east,X3 = east,Y3 = east;
X2 = east,X3 = east,Y3 = east;

X1 = west,X2 = west,Y1 = west;
X1 = west,X3 = west,Y1 = west;
X2 = west,X3 = west,Y1 = west;

X1 = west,X2 = west,Y2 = west;
X1 = west,X3 = west,Y2 = west;
X2 = west,X3 = west,Y2 = west;

X1 = west,X2 = west,Y3 = west;
X1 = west,X3 = west,Y3 = west;
X2 = west,X3 = west,Y3 = west;

X1 = east,X2 = east,X3 = east,Y1 = east;
X1 = east,X2 = east,X3 = east,Y2 = east;
X1 = east,X2 = east,X3 = east,Y3 = east;

X1 = west,X2 = west,X3 = west,Y1 = west;
X1 = west,X2 = west,X3 = west,Y2 = west;
X1 = west,X2 = west,X3 = west,Y3 = west;


X1 = east,X2 = east,X3 = east,Y1 = east,Y2 = east;
X1 = east,X2 = east,X3 = east,Y1 = east,Y3 = east;
X1 = east,X2 = east,X3 = east,Y2 = east,Y3 = east;

X1 = west,X2 = west,X3 = west,Y1 = west,Y2 = west;
X1 = west,X2 = west,X3 = west,Y1 = west,Y3 = west;
X1 = west,X2 = west,X3 = west,Y2 = west,Y3 = west.



   path(Start,Finish,L,L1):-
         move(Start,S1),
         not(unsafe(S1)),
         not(member(S1,L)),
         path(S1,Finish,[S1|L],L1),!.
   path(Finish,Finish,T,T):-!.   /* The final state is reached  */

   go:-go(state(east,east,east,east,east,east),state(west,west,west,west,west,west)).

   go(Start,Finish):-
        path(Start,Finish,[Start],L),
        nl,write("A solution is:"),nl,
        write_path(L),
        fail.
   go(_,_).

member(X,[X|_]).
member(X,[_|L]):-member(X,L).


/*1 kannibal*/
write_move(state(X,K2,K3,M1,M2,M3),state(Y,K2,K3,M1,M2,M3)):-!,
           write("1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl.
write_move(state(K1,X,K3,M1,M2,M3),state(K1,Y,K3,M1,M2,M3)):-!,
           write("1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,X,M1,M2,M3),state(K1,K2,Y,M1,M2,M3)):-!,
           write("1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
/*2 kannibala */
write_move(state(X,X,K3,M1,M2,M3),state(Y,Y,K3,M1,M2,M3)):-!,
           write("2 kannibala goes from"),
           write(X),
           write(" to "),
           write(Y),nl.
write_move(state(X,K2,X,M1,M2,M3),state(Y,K2,Y,M1,M2,M3)):-!,
           write("2 kannibala goes from"),
           write(X),
           write(" to "),
           write(Y),nl.
write_move(state(K1,X,X,M1,M2,M3),state(K1,Y,Y,M1,M2,M3)):-!,
           write("2 kannibala goes from"),
           write(X),
           write(" to "),
           write(Y),nl.
/*3 kannibala*/
write_move(state(X,X,X,M1,M2,M3),state(Y,Y,Y,M1,M2,M3)):-!,
           write("3 kannibala goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
/*1 missioner*/
write_move(state(K1,K2,K3,X,M2,M3),state(K1,K2,K3,Y,M2,M3)):-!,
           write("1 missioner goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,K3,M1,X,M3),state(K1,K2,K3,M1,Y,M3)):-!,
           write("1 missioner goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,K3,M1,M2,X),state(K1,K2,K3,M1,M2,Y)):-!,
           write("1 missioner goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
/*2 missionera*/
write_move(state(K1,K2,K3,X,X,M3),state(K1,K2,K3,Y,Y,M3)):-!,
           write("2 missionera goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,K3,M1,X,X),state(K1,K2,K3,M1,Y,Y)):-!,
           write("2 missionera goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,K3,X,M2,X),state(K1,K2,K3,Y,M2,Y)):-!,
           write("2 missionera goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
/*3 missionera*/
write_move(state(K1,K2,K3,X,X,X),state(K1,K2,K3,Y,Y,Y)):-!,
           write("3 missionera goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
/*1 kannibal, 1 missioner*/
write_move(state(X,K2,K3,X,M2,M3),state(Y,K2,K3,Y,M2,M3)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,X,K3,X,M2,M3),state(K1,Y,K3,Y,M2,M3)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,X,X,M2,M3),state(K1,K2,Y,Y,M2,M3)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(X,K2,K3,M1,X,M3),state(Y,K2,K3,M1,Y,M3)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,X,K3,M1,X,M3),state(K1,Y,K3,M1,Y,M3)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,X,M1,X,M3),state(K1,K2,Y,M1,Y,M3)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(X,K2,K3,M1,M2,X),state(Y,K2,K3,M1,M2,Y)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,X,K3,M1,M2,X),state(K1,Y,K3,M1,M2,Y)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,X,M1,M2,X),state(K1,K2,Y,M1,M2,Y)):-!,
           write("1 missioner, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
/*1 kannibal, 2 missionera*/
write_move(state(X,K2,K3,X,X,M3),state(Y,K2,K3,Y,Y,M3)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(X,K2,K3,M1,X,X),state(Y,K2,K3,M1,Y,Y)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(X,K2,K3,X,M2,X),state(Y,K2,K3,Y,M2,Y)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,X,K3,X,X,M3),state(Y,K2,K3,Y,Y,M3)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,X,K3,M1,X,X),state(K1,Y,K3,M1,Y,Y)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,X,K3,X,M2,X),state(K1,Y,K3,Y,M2,Y)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,X,X,X,M3),state(K1,K2,Y,Y,Y,M3)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,X,M1,X,X),state(K1,K2,Y,M1,Y,Y)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl. 
write_move(state(K1,K2,X,X,M2,X),state(K1,K2,Y,Y,M2,Y)):-!,
           write("2 missionera, 1 kannibal goes from"),
           write(X),
           write(" to "),
           write(Y),nl.   


   write_path([H1,H2|T]):-!,
           write_move(H1,H2),write_path([H2|T]).
   write_path(_).

?-go.
« Последнее редактирование: 14-05-2009 15:42 от Джон » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 14-05-2009 15:58 » 

Сперва хорошо бы понять правильное решение.

На берегах и в лодке 3, 0, 0 миссионера и 3, 0, 0 каннибала.
1 миссионер и 1 каннибал садятся в лодку, лодка отчаливает.
На берегах и в лодке 2, 0, 1 миссионера и 2, 0, 1 каннибала.
Лодка причаливает, из неё все выходят на берег.
На берегах и в лодке 2, 1, 0 миссионера и 2, 1, 0 каннибала.
1 миссионер садится в лодку, лодка отчаливает.
На берегах и в лодке 2, 0, 1 миссионера и 2, 1, 0 каннибала.
Лодка причаливает, из неё все выходят на берег.
На берегах и в лодке 3, 0, 0 миссионера и 2, 1, 0 каннибала.
2 миссионера и 1 каннибал садятся в лодку, лодка отчаливает.
На берегах и в лодке 1, 0, 2 миссионера и 1, 1, 1 каннибала.
Лодка причаливает, из неё все выходят на берег.
На берегах и в лодке 1, 2, 0 миссионера и 1, 2, 0 каннибала.
2 миссионера садятся в лодку, лодка отчаливает.
На берегах и в лодке 1, 0, 2 миссионера и 1, 2, 0 каннибала.
Лодка причаливает, из неё все выходят на берег.
На берегах и в лодке 3, 0, 0 миссионера и 1, 2, 0 каннибала.

А вот дальше плохо. Как только пара миссионеров посадит в лодку оставшегсоя каннибала и переплывёт на другой берег, возникнет момент, когда на берегу 3 каннибала и 2 миссионера.

Задача решается только при условии, что пункта "все выходят на берег" нет? Т.е. хотя лодка и стоит у берега, но если из неё не выходить, то это не считается, и находящиеся внутри лодки не суммируются с находящимися на берегу.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
blondinka62733
Гость
« Ответ #2 : 14-05-2009 20:20 » 

вообще ответ я нашла такой: Первыми пересекают реку миссионер и каннибал. После этого миссионер возвращается. Затем пересекают реку два каннибала. Один из них возвращается. Потом два миссионера пересекают реку. Миссионер и каннибал возвращаются. Два миссионера пересекают реку. Один каннибал возвращается. Два каннибала пересекают реку. Один каннибал возвращается. Два оставшихся каннибала пересекают реку.
Надеюсь на помощь...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-05-2009 18:41 » 

Можно начать с простеньких примеров, чтобы разобраться, в каких случаях программа выдаёт Yes/No, а в каких - варианты ответов.

Допустим, местоположение некоторого лица, которое описывается 2 вариантами: исходный берег и берег назначения.
Код: (Prolog)
location(Location) :-
        Location = initialBank;
        Location = targetBank.

При запуске имеем:
Код:
| ?- location(initialBank).

yes
| ?- location(targetBank).

yes
| ?- location(Location).

Location = initialBank ? ;

Location = targetBank

yes
| ?- location(x).

no

Отсюда видно, что ответ Yes без вариантов выдаётся в случае, когда в запросе:
- либо нет свободной переменной, а значение связанной переменной согласуется с предикатом;
- либо предикат всегда истинен.

Предельно упрощённый случай такой:
Код: (Prolog)
test(_).
Этот предикат всегда истинен, поэтому не имеет вариантов для подстановки в свободную переменную:
Код:
| ?- test(x).

yes
| ?- test(X).

yes
« Последнее редактирование: 15-05-2009 18:46 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
blondinka62733
Гость
« Ответ #4 : 16-05-2009 09:52 » 

Честно говоря ничего не поняла ((((((
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 16-05-2009 11:39 » 

Цитата: blondinka62733
Помогите исправить код...
Цитата: blondinka62733
Честно говоря ничего не поняла ((((((
Из этого следует, что код не твой?

Кто ж халяву-то общал? Мы тут за тебя логическое программирование вообще и язык Prolog в частности учить не будем.

Я охотно допускаю, что можно в чём-то запутаться, если программа относительно большая и сложная. Но если ты вообще ничего не понимаешь, то и разговаривать не о чем. Бери учебник по Prolog и читай. Если что-то будет в учебнике непонятно - задавай вопросы.

Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
blondinka62733
Гость
« Ответ #6 : 16-05-2009 12:42 » 

да... код мы писали не сами, мы его скачали с другого форума... он не работал... мы его исправляли и что-то ничего не получается. просили помочь препода, толком ничего не помог, сказал, что код в общем-то вроде правильный и чтобы мы пробовали менять местами move, но что-то толку от этого мало... А то что вы мне написали непонятно, потому что код вроде как на другом прологе...     
Strawberry Prolog отличается ((((((((
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 16-05-2009 14:34 » 

blondinka62733, какая разница, какой Prolog? Принципы работы программы от этого не меняются.

И замена местами move тут вообще к делу не относится.

Prolog - язык старый, по нему написаны отличные учебники. Лично мне симпатичен:

Стерлинг Л., Шапиро Э. "Искусство программирования на языке Пролог", М.: Мир, 1990
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
blondinka62733
Гость
« Ответ #8 : 16-05-2009 16:14 » new

спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines