Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Задача о переправе через реку (не коза-капуста-волк)
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
tentul tentul вне форума
Member
 
Сообщений: 124
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2005
По умолчанию 08.10.2005, 05:15

а почему не эквивалентно?
Кто-то отплывает, мы проверяем, остается ли безопасно на берегу с которого отплывают, а безопасность в лодке обеспечивается удалением заведомо ненужных мувов. А берег "куда плывем" нас уже не волнует
Просто интересно

А с задачей все более прозаично получилось, в условии опечатка, лодка все же трехместная. И естественно никак смягчать условие безопасности не нужно. Решениенаходится
Спасибо за разговор :)
Ответить с цитированием
  (#17 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,909
Сказал(а) спасибо: 2
Поблагодарили 297 раз(а) в 297 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 09.10.2005, 00:50

Код:
Решение находится
Так где оно, решение?
А то такой длинный разговор, а в итоге никакого результата.
Ответить с цитированием
  (#18 (permalink)) Старый
tentul tentul вне форума
Member
 
Сообщений: 124
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2005
По умолчанию 09.10.2005, 01:47

Вот Я надеялся и на Ваше мнение все эти дни

Код:
  Solution:
O1,O2,O4     1 ->> 2
O1,O4        2 ->> 1
K1,O1,K2     1 ->> 2
K1,K2,O2     2 ->> 1
K1,K4,O4     1 ->> 2
K1,O1,K4     2 ->> 1
O1,O2,O3     1 ->> 2
O4           2 ->> 1
K1,K2,K3     1 ->> 2
K1,O1        2 ->> 1
K1,O1,K4     1 ->> 2
O1,O2,O3     2 ->> 1
O1,O3,O4     1 ->> 2
K1,O1,K2     2 ->> 1
K1,K2,O2     1 ->> 2
K1,K3,O3     2 ->> 1
K1,O1,K3     1 ->> 2
O1,O2        2 ->> 1
O1,O2,O3     1 ->> 2

Yes
А сама программа:
Код:
main:-  go(state(2,2,2,2,2,2,2,2),state(1,1,1,1,1,1,1,1)).

/* +FinalState, +InitialState */ 
go(S,G):-
        path(1,S,G,[S],L),
        nl,write('  Solution:'),nl,
        write_path(L),
        fail.
go(_,_).

/* +Current 'From' Bank, +CurrentState, +InitialState, +CurrentPath, -FinalPath */
path(_,G,G,T,T).
path(From,S,G,L,L1):-
         move(S,S1,From1),
         From = From1,   
         not( unsafe(S1) ),
         not( member(S1,L) ),    
         path( From1, S1,G,[S1|L],L1),!.

/* +CurrentState, -PreviousState, -'From' Bank */
move(state(X,X,X,O2,K3,O3,K4,O4),state(Y,Y,Y,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(X,X,K2,O2,X,O3,K4,O4),state(Y,Y,K2,O2,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(X,X,K2,O2,K3,O3,X,O4),state(Y,Y,K2,O2,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(X,O1,X,X,K3,O3,K4,O4),state(Y,O1,Y,Y,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(X,O1,X,O2,X,O3,K4,O4),state(Y,O1,Y,O2,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(X,O1,X,O2,K3,O3,X,O4),state(Y,O1,Y,O2,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(X,O1,K2,O2,X,X,K4,O4),state(Y,O1,K2,O2,Y,Y,K4,O4), X):- opposite(X,Y).
move(state(X,O1,K2,O2,X,O3,X,O4),state(Y,O1,K2,O2,Y,O3,Y,O4), X):- opposite(X,Y).
move(state(X,O1,K2,O2,K3,O3,X,X),state(Y,O1,K2,O2,K3,O3,Y,Y), X):- opposite(X,Y).
move(state(K1,X,K2,X,K3,X,K4,O4),state(K1,Y,K2,Y,K3,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,X,K2,X,K3,O3,K4,X),state(K1,Y,K2,Y,K3,O3,K4,Y), X):- opposite(X,Y).
move(state(K1,X,K2,O2,K3,X,K4,X),state(K1,Y,K2,O2,K3,Y,K4,Y), X):- opposite(X,Y).
move(state(K1,O1,X,X,X,O3,K4,O4),state(K1,O1,Y,Y,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,X,X,K3,O3,X,O4),state(K1,O1,Y,Y,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,X,X,K4,O4),state(K1,O1,Y,O2,Y,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,X,O3,X,O4),state(K1,O1,Y,O2,Y,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,K3,O3,X,X),state(K1,O1,Y,O2,K3,O3,Y,Y), X):- opposite(X,Y).
move(state(K1,O1,K2,X,K3,X,K4,X),state(K1,O1,K2,Y,K3,Y,K4,Y), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,X,X,X,O4),state(K1,O1,K2,O2,Y,Y,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,X,O3,X,X),state(K1,O1,K2,O2,Y,O3,Y,Y), X):- opposite(X,Y).

move(state(X,X,K2,O2,K3,O3,K4,O4),state(Y,Y,K2,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(X,O1,X,O2,K3,O3,K4,O4),state(Y,O1,Y,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(X,O1,K2,O2,X,O3,K4,O4),state(Y,O1,K2,O2,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(X,O1,K2,O2,K3,O3,X,O4),state(Y,O1,K2,O2,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,X,K2,X,K3,O3,K4,O4),state(K1,Y,K2,Y,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,X,K2,O2,K3,X,K4,O4),state(K1,Y,K2,O2,K3,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,X,K2,O2,K3,O3,K4,X),state(K1,Y,K2,O2,K3,O3,K4,Y), X):- opposite(X,Y).
move(state(K1,O1,X,X,K3,O3,K4,O4),state(K1,O1,Y,Y,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,X,O3,K4,O4),state(K1,O1,Y,O2,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,K3,O3,X,O4),state(K1,O1,Y,O2,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,X,K3,X,K4,O4),state(K1,O1,K2,Y,K3,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,X,K3,O3,K4,X),state(K1,O1,K2,Y,K3,O3,K4,Y), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,X,X,K4,O4),state(K1,O1,K2,O2,Y,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,X,O3,X,O4),state(K1,O1,K2,O2,Y,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,X,K4,X),state(K1,O1,K2,O2,K3,Y,K4,Y), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,O3,X,X),state(K1,O1,K2,O2,K3,O3,Y,Y), X):- opposite(X,Y).

move(state(X,O1,K2,O2,K3,O3,K4,O4),state(Y,O1,K2,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,X,K2,O2,K3,O3,K4,O4),state(K1,Y,K2,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,K3,O3,K4,O4),state(K1,O1,Y,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,X,K3,O3,K4,O4),state(K1,O1,K2,Y,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,X,O3,K4,O4),state(K1,O1,K2,O2,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,X,K4,O4),state(K1,O1,K2,O2,K3,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,O3,X,O4),state(K1,O1,K2,O2,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,O3,K4,X),state(K1,O1,K2,O2,K3,O3,K4,Y), X):- opposite(X,Y).

/* -FirstBank, -SecondBank */
opposite(1,2).
opposite(2,1).

/* +State */
unsafe( state(Y,X,X,_,_,_,_,_) ):- not(X=Y).
unsafe( state(Y,X,_,_,X,_,_,_) ):- not(X=Y).
unsafe( state(Y,X,_,_,_,_,X,_) ):- not(X=Y).
unsafe( state(X,_,Y,X,_,_,_,_) ):- not(X=Y).
unsafe( state(_,_,Y,X,X,_,_,_) ):- not(X=Y).
unsafe( state(_,_,Y,X,_,_,X,_) ):- not(X=Y).
unsafe( state(X,_,_,_,Y,X,_,_) ):- not(X=Y).
unsafe( state(_,_,X,_,Y,X,_,_) ):- not(X=Y).
unsafe( state(_,_,_,_,Y,X,X,_) ):- not(X=Y).
unsafe( state(X,_,_,_,_,_,Y,X) ):- not(X=Y).
unsafe( state(_,_,X,_,_,_,Y,X) ):- not(X=Y).
unsafe( state(_,_,_,_,X,_,Y,X) ):- not(X=Y).

/* +ListElement, +List */
member(X,[X|_]).
member(X,[_|L]):- member(X,L).

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

/* +CurrentState, +NextState */


write_move(state(X,X,X,O2,K3,O3,K4,O4),state(Y,Y,Y,O2,K3,O3,K4,O4) ):-  !,
    write('K1,O1,K2     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(X,X,K2,O2,X,O3,K4,O4),state(Y,Y,K2,O2,Y,O3,K4,O4) ):-  !,
    write('K1,O1,K3     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(X,X,K2,O2,K3,O3,X,O4),state(Y,Y,K2,O2,K3,O3,Y,O4) ):-  !,
    write('K1,O1,K4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(X,O1,X,X,K3,O3,K4,O4),state(Y,O1,Y,Y,K3,O3,K4,O4) ):-  !,
    write('K1,K2,O2     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(X,O1,X,O2,X,O3,K4,O4),state(Y,O1,Y,O2,Y,O3,K4,O4) ):-  !,
    write('K1,K2,K3     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(X,O1,X,O2,K3,O3,X,O4),state(Y,O1,Y,O2,K3,O3,Y,O4) ):-  !,
    write('K1,K2,K4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(X,O1,K2,O2,X,X,K4,O4),state(Y,O1,K2,O2,Y,Y,K4,O4) ):-  !,
    write('K1,K3,O3     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(X,O1,K2,O2,X,O3,X,O4),state(Y,O1,K2,O2,Y,O3,Y,O4) ):-  !,
    write('K1,K3,K4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(X,O1,K2,O2,K3,O3,X,X),state(Y,O1,K2,O2,K3,O3,Y,Y) ):-  !,
    write('K1,K4,O4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,X,K2,X,K3,X,K4,O4),state(K1,Y,K2,Y,K3,Y,K4,O4) ):-  !,
    write('O1,O2,O3     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,X,K2,X,K3,O3,K4,X),state(K1,Y,K2,Y,K3,O3,K4,Y) ):-  !,
    write('O1,O2,O4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,X,K2,O2,K3,X,K4,X),state(K1,Y,K2,O2,K3,Y,K4,Y) ):-  !,
    write('O1,O3,O4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,O1,X,X,X,O3,K4,O4),state(K1,O1,Y,Y,Y,O3,K4,O4) ):-  !,
    write('K2,O2,K3     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,O1,X,X,K3,O3,X,O4),state(K1,O1,Y,Y,K3,O3,Y,O4) ):-  !,
    write('K2,O2,K4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,O1,X,O2,X,X,K4,O4),state(K1,O1,Y,O2,Y,Y,K4,O4) ):-  !,
    write('K2,K3,O3     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,O1,X,O2,X,O3,X,O4),state(K1,O1,Y,O2,Y,O3,Y,O4) ):-  !,
    write('K2,K3,K4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,O1,X,O2,K3,O3,X,X),state(K1,O1,Y,O2,K3,O3,Y,Y) ):-  !,
    write('K2,K4,O4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,O1,K2,X,K3,X,K4,X),state(K1,O1,K2,Y,K3,Y,K4,Y) ):-  !,
    write('O2,O3,O4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,O1,K2,O2,X,X,X,O4),state(K1,O1,K2,O2,Y,Y,Y,O4) ):-  !,
    write('K3,O3,K4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 

write_move(state(K1,O1,K2,O2,X,O3,X,X),state(K1,O1,K2,O2,Y,O3,Y,Y) ):-  !,
    write('K3,K4,O4     '),
    write(X),
    write(' ->> '),
    write(Y),nl.   


write_move(state(X,O1,K2,O2,K3,O3,K4,O4), state(Y,O1,K2,O2,K3,O3,K4,O4) ):- !,
    write('K1           '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(X,X,K2,O2,K3,O3,K4,O4), state(Y,Y,K2,O2,K3,O3,K4,O4) ):- !,
    write('K1,O1        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(X,O1,X,O2,K3,O3,K4,O4), state(Y,O1,Y,O2,K3,O3,K4,O4) ):- !,
    write('K1,K2        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(X,O1,K2,O2,X,O3,K4,O4), state(Y,O1,K2,O2,Y,O3,K4,O4) ):- !,           
    write('K1,K3        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(X,O1,K2,O2,K3,O3,X,O4), state(Y,O1,K2,O2,K3,O3,Y,O4) ):- !,
    write('K1,K4        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,X,K2,O2,K3,O3,K4,O4), state(K1,Y,K2,O2,K3,O3,K4,O4) ):- !,
    write('O1           '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,X,K2,X,K3,O3,K4,O4), state(K1,Y,K2,Y,K3,O3,K4,O4) ):- !,
    write('O1,O2        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,X,K2,O2,K3,X,K4,O4), state(K1,Y,K2,O2,K3,Y,K4,O4) ):- !,
    write('O1,O3        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,X,K2,O2,K3,O3,K4,X), state(K1,Y,K2,O2,K3,O3,K4,Y) ):- !,
    write('O1,O4        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,X,O2,K3,O3,K4,O4), state(K1,O1,Y,O2,K3,O3,K4,O4) ):- !,
    write('K2           '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,X,X,K3,O3,K4,O4), state(K1,O1,Y,Y,K3,O3,K4,O4) ):- !,
    write('K2,O2        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,X,O2,X,O3,K4,O4), state(K1,O1,Y,O2,Y,O3,K4,O4) ):- !,
    write('K2,K3        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,X,O2,K3,O3,X,O4), state(K1,O1,Y,O2,K3,O3,Y,O4) ):- !,
    write('K2,K4        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,X,K3,O3,K4,O4), state(K1,O1,K2,Y,K3,O3,K4,O4) ):- !,
    write('O2           '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,X,K3,X,K4,O4), state(K1,O1,K2,Y,K3,Y,K4,O4) ):- !,
    write('O2,O3        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,X,K3,O3,K4,X), state(K1,O1,K2,Y,K3,O3,K4,Y) ):- !,
    write('O2,O4        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,X,O3,K4,O4), state(K1,O1,K2,O2,Y,O3,K4,O4) ):- !,
    write('K3           '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,X,X,K4,O4), state(K1,O1,K2,O2,Y,Y,K4,O4) ):- !,
    write('K3,O3        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,X,O3,X,O4), state(K1,O1,K2,O2,Y,O3,Y,O4) ):- !,
    write('K3,K4        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,X,K4,O4), state(K1,O1,K2,O2,K3,Y,K4,O4) ):- !,
    write('O3           '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,X,K4,X), state(K1,O1,K2,O2,K3,Y,K4,Y) ):- !,
    write('O3,O4        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,O3,X,O4), state(K1,O1,K2,O2,K3,O3,Y,O4) ):- !,
    write('K4           '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,O3,X,X), state(K1,O1,K2,O2,K3,O3,Y,Y) ):- !,
    write('K4,O4        '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,O3,K4,X), state(K1,O1,K2,O2,K3,O3,K4,Y) ):- !,
    write('O4           '),
    write(X),
    write(' ->> '),
    write(Y),nl.
Ответить с цитированием
  (#19 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 10.10.2005, 14:02

В классическом варианте задачи про рыцарей и оруженосцев лодка все-таки двухместная. Вот один из ответов:
Код:
1.  R1 and O1 - from east to west
2.  R1 - from west to east
3.  R2 and O2 - from east to west
4.  O1 - from west to east
5.  R1 and O1 - from east to west
6.  O1 - from west to east
7.  O1 and O3 - from east to west
8.  O3 - from west to east
9.  R3 and O3 - from east to west
10.  O1 - from west to east
11.  R4 and O4 - from east to west
12.  R1 - from west to east
13.  R1 and O1 - from east to west
С трехместной лодкой задачка, конечно, полегче, и решение короче:
Код:
1.  O1,O2,O3 - from east to west
2.  O1 - from west to east
3.  R2,R3 - from east to west
4.  R2,O2 - from west to east
5.  R1,R2,R4 - from east to west
6.  O3 - from west to east
7.  O1,O2,O3 - from east to west
8.  R4 - from west to east
9.  R4,O4 - from east to west
Ответить с цитированием
  (#20 (permalink)) Старый
tentul tentul вне форума
Member
 
Сообщений: 124
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2005
По умолчанию 10.10.2005, 21:17

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

Решение, что я получил, конечно подлиннее вашего, но мне нужно использовать именно поиск _в глубину_. В ширину и следующие - это следующие лабораторные. Там все будет вкуснее

p. s.
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 10.10.2005, 21:44

Цитата:
Условие оруженосцев в варианте с двухместной лодкой полностью не выполняется, согласны?
Категорически нет. Все абсолютно верно. Я много раз Вам объясняла классическую постановку задачи, но Вы ее так и не поняли.
Цитата:
А жульничать как-то тоже не очень.
Надеюсь, Вы это себе?
Ответить с цитированием
  (#22 (permalink)) Старый
tentul tentul вне форума
Member
 
Сообщений: 124
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2005
По умолчанию 11.10.2005, 13:02

Я не знаю классическую постановку задачу в Вашем понимании, но разберем первых 3 хода решения, что Вы привели

R1 and O1 - from east to west (На запада Р1, О1)
R1 - from west to east ( На западе только О1)
R2 and O2 - from east to west (На западе Р2 О2 и О1 . О1 без рыцаря, т.е. он находится с чужим рыцарем без хозяина. И где я не понял Ваше условие? Условие проверяется только при отъезде лодки, но не при прибытии. Не так? )

Я неверно подобрал слово. Не жульничество, а смягчение условия оруженосцев

P.S опять: Мне надо было решить не классическую задачу в Вашем понимании, а задачу, что была приведена в начале темы, которую я получил от преподавателя.
Ответить с цитированием
  (#23 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 11.10.2005, 17:29

Цитата:
Условие проверяется только при отъезде лодки, но не при прибытии. Не так?
Нет, не так. Условие проверяется, когда кто-то сидит в лодке. А Ваши попытки реализовать это были неправильными.
Цитата:
Мне надо было решить не классическую задачу в Вашем понимании, а задачу, что была приведена в начале темы, которую я получил от преподавателя.
В начале темы один раз употребляется слово "трехместная", а другой - "двухместная". Так что пеняйте на себя.
Разговор стал окончательно бессмысленным. По-моему, достаточно.
Ответить с цитированием
  (#24 (permalink)) Старый
tentul tentul вне форума
Member
 
Сообщений: 124
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2005
По умолчанию 11.10.2005, 19:15

[quote]Originally posted by Alison
[b]
Цитата:
В начале темы один раз употребляется слово "трехместная", а другой - "двухместная". Так что пеняйте на себя.
Опечатка в выданом мне задании, я в начале пытался решить задачу для двухместной

Цитата:
Разговор стал окончательно бессмысленным. По-моему, достаточно.
Согласен
Ответить с цитированием
Ads
  (#25 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 11.10.2005, 20:37

Вы не понимаете главного.
Состояние - это набор местоположений, который состоит из местоположений всех людей. И проверяется не "состояние" на отдельном берегу (так можно было бы, но у Вас для этого ничего сделано не было), а общее текущее состояние.
Ответить с цитированием
  (#26 (permalink)) Старый
tentul tentul вне форума
Member
 
Сообщений: 124
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2005
По умолчанию 11.10.2005, 21:31

Не могу согласиться, потому продолжаю

Цитата:
Вы не понимаете главного.
Состояние - это набор местоположений, который состоит из местоположений всех людей.
Alison Я уже так изжевал эту несчастную лабу, что не понимать, для чего у меня структура state просто не могу. Разбирая эту лабу хоть начал понимать, "механизм" Пролога. За что спасибо и Вам конечно.


Еще в конце первой страницы я привел

Код:
unsafe( From,state(Y,X,X,_,_,_,_,_) ):- not(X=Y), X=From.
unsafe( From,state(Y,X,_,_,X,_,_,_) ):- not(X=Y), X=From.
unsafe( From,state(Y,X,_,_,_,_,X,_) ):- not(X=Y), X=From.

unsafe( From,state(X,_,Y,X,_,_,_,_) ):- not(X=Y), X=From.
unsafe( From,state(_,_,Y,X,X,_,_,_) ):- not(X=Y), X=From.
unsafe( From,state(_,_,Y,X,_,_,X,_) ):- not(X=Y), X=From.

unsafe( From,state(X,_,_,_,Y,X,_,_) ):- not(X=Y), X=From.
unsafe( From,state(_,_,X,_,Y,X,_,_) ):- not(X=Y), X=From.
unsafe( From,state(_,_,_,_,Y,X,X,_) ):- not(X=Y), X=From.

unsafe( From,state(X,_,_,_,_,_,Y,X) ):- not(X=Y), X=From.
unsafe( From,state(_,_,X,_,_,_,Y,X) ):- not(X=Y), X=From.

unsafe( From,state(_,_,_,_,X,_,Y,X) ):- not(X=Y), X=From.
Y - местоположение рыцаря-хозяина
X - местоположение оруженосца

Перечислены опасные ситуации. Но они опасны только если рыцарь с оруженосцем не на 1 берегу - not(X=Y) - и оставшийся бедный оруженосец с кем-то из других рыцарей остался на берегу _From_ (ОТКУДА плывет лодка) - X=From. Если даже оруженосец остается с чужим рыцарем без своего, НО на противоположном к 'From' берегу, то это условие небезопасности ложно, и имеем безопасную ситуацию. (Что есть и в Вашей идее проверки безопасности в лодке: Чужой рыцарь вылезает на берег, а оруженосец с берега в лодку, и они не встречаются). Ну а на противоположном берегу такому оруженосцу естественно надо будет возвращаться обратно, потмоу что берегом 'From' уже будет тот берег, где он один с чужим рыцарем. Потому я считаю, что правильно реализовал Вашу идею, и тем более она работает. А не как Вы выразились "были попытки" ). Длинный же ответ объясняется только очередностью расположения предикатов move (так как поиск в глубину).

/* From инициализируется при вызове предиката move(State1,State2,From) */
Ответить с цитированием
  (#27 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 11.10.2005, 21:41

Моя идея для двухместной лодки у Вас не была реализована.
С трехместной лодкой вообще проблем нет - это легкая задачка, и речи о ней нет тоже.
А вот с двухместной лодкой у Вас так не вышло бы ничего.
Ответить с цитированием
  (#28 (permalink)) Старый
tentul tentul вне форума
Member
 
Сообщений: 124
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2005
По умолчанию 11.10.2005, 21:51

Alison ....
Не "не вышло бы", а уже вышло... Я на бумаге прошел все выданое мне решение (где-то и были смешные телодвижения) .
Если Вы так упираетесь, приведите пример, при какой расстановке людей и каком перемещении Ваша "проверка в лодке" примет какое-то состояние за безопасное, а мой вариант - нет. Или наоборот



Добавил:

Такое впечатление, что Вы не прочли мое предыдущее сообщение, а просто увидели "правильно реализовал идею" и ответили..
Ответить с цитированием
  (#29 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 11.10.2005, 21:54

Приведите программу для двухместной лодки и для четырех пар рыцарей с оруженосцами, а также выданное этой программой решение. Речь именно о такой программе.
Ответить с цитированием
  (#30 (permalink)) Старый
tentul tentul вне форума
Member
 
Сообщений: 124
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2005
По умолчанию 11.10.2005, 22:02

Не заметил для какого варианта та программа. Видно когда выложил вариант для настоящей задачи, двухместную в предыдущих постах затер, чтобы не "оверпостить". Выкладываю для двухместной

Код:
main:-  go(state(2,2,2,2,2,2,2,2),state(1,1,1,1,1,1,1,1)).

/* +FinalState, +InitialState */ 
go(S,G):-
        path(1,S,G,[S],L),
        nl,write('  Solution:'),nl,
        write_path(L),
        fail.
go(_,_).

/* +Current 'From' Bank, +CurrentState, +InitialState, +CurrentPath, -FinalPath */
path(_,G,G,T,T).
path(From,S,G,L,L1):-
         move(S,S1,From1),
         From = From1,   
         not( unsafe(From1,S1) ),
         not( member(S1,L) ),    
         path( From1, S1,G,[S1|L],L1),!.

/* +CurrentState, -PreviousState, -'From' Bank */
move(state(X,X,K2,O2,K3,O3,K4,O4),state(Y,Y,K2,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(X,O1,X,O2,K3,O3,K4,O4),state(Y,O1,Y,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(X,O1,K2,O2,X,O3,K4,O4),state(Y,O1,K2,O2,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(X,O1,K2,O2,K3,O3,X,O4),state(Y,O1,K2,O2,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,X,K2,X,K3,O3,K4,O4),state(K1,Y,K2,Y,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,X,K2,O2,K3,X,K4,O4),state(K1,Y,K2,O2,K3,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,X,K2,O2,K3,O3,K4,X),state(K1,Y,K2,O2,K3,O3,K4,Y), X):- opposite(X,Y).
move(state(K1,O1,X,X,K3,O3,K4,O4),state(K1,O1,Y,Y,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,X,O3,K4,O4),state(K1,O1,Y,O2,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,K3,O3,X,O4),state(K1,O1,Y,O2,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,X,K3,X,K4,O4),state(K1,O1,K2,Y,K3,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,X,K3,O3,K4,X),state(K1,O1,K2,Y,K3,O3,K4,Y), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,X,X,K4,O4),state(K1,O1,K2,O2,Y,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,X,O3,X,O4),state(K1,O1,K2,O2,Y,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,X,K4,X),state(K1,O1,K2,O2,K3,Y,K4,Y), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,O3,X,X),state(K1,O1,K2,O2,K3,O3,Y,Y), X):- opposite(X,Y).
move(state(X,O1,K2,O2,K3,O3,K4,O4),state(Y,O1,K2,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,X,K2,O2,K3,O3,K4,O4),state(K1,Y,K2,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,X,O2,K3,O3,K4,O4),state(K1,O1,Y,O2,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,X,K3,O3,K4,O4),state(K1,O1,K2,Y,K3,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,X,O3,K4,O4),state(K1,O1,K2,O2,Y,O3,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,X,K4,O4),state(K1,O1,K2,O2,K3,Y,K4,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,O3,X,O4),state(K1,O1,K2,O2,K3,O3,Y,O4), X):- opposite(X,Y).
move(state(K1,O1,K2,O2,K3,O3,K4,X),state(K1,O1,K2,O2,K3,O3,K4,Y), X):- opposite(X,Y).

/* -FirstBank, -SecondBank */
opposite(1,2).
opposite(2,1).

/* +'From' Bank, +State */
unsafe( From,state(Y,X,X,_,_,_,_,_) ):- not(X=Y), X=From.
unsafe( From,state(Y,X,_,_,X,_,_,_) ):- not(X=Y), X=From.
unsafe( From,state(Y,X,_,_,_,_,X,_) ):- not(X=Y), X=From.
unsafe( From,state(X,_,Y,X,_,_,_,_) ):- not(X=Y), X=From.
unsafe( From,state(_,_,Y,X,X,_,_,_) ):- not(X=Y), X=From.
unsafe( From,state(_,_,Y,X,_,_,X,_) ):- not(X=Y), X=From.
unsafe( From,state(X,_,_,_,Y,X,_,_) ):- not(X=Y), X=From.
unsafe( From,state(_,_,X,_,Y,X,_,_) ):- not(X=Y), X=From.
unsafe( From,state(_,_,_,_,Y,X,X,_) ):- not(X=Y), X=From.
unsafe( From,state(X,_,_,_,_,_,Y,X) ):- not(X=Y), X=From.
unsafe( From,state(_,_,X,_,_,_,Y,X) ):- not(X=Y), X=From.
unsafe( From,state(_,_,_,_,X,_,Y,X) ):- not(X=Y), X=From.

/* +ListElement, +List */
member(X,[X|_]).
member(X,[_|L]):- member(X,L).

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

/* +CurrentState, +NextState */
write_move(state(X,O1,K2,O2,K3,O3,K4,O4), state(Y,O1,K2,O2,K3,O3,K4,O4) ):- !,
    write('K1     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(X,X,K2,O2,K3,O3,K4,O4), state(Y,Y,K2,O2,K3,O3,K4,O4) ):- !,
    write('K1,O1  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(X,O1,X,O2,K3,O3,K4,O4), state(Y,O1,Y,O2,K3,O3,K4,O4) ):- !,
    write('K1,K2  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(X,O1,K2,O2,X,O3,K4,O4), state(Y,O1,K2,O2,Y,O3,K4,O4) ):- !,           
    write('K1,K3  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(X,O1,K2,O2,K3,O3,X,O4), state(Y,O1,K2,O2,K3,O3,Y,O4) ):- !,
    write('K1,K4  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,X,K2,O2,K3,O3,K4,O4), state(K1,Y,K2,O2,K3,O3,K4,O4) ):- !,
    write('O1     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,X,K2,X,K3,O3,K4,O4), state(K1,Y,K2,Y,K3,O3,K4,O4) ):- !,
    write('O1,O2  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,X,K2,O2,K3,X,K4,O4), state(K1,Y,K2,O2,K3,Y,K4,O4) ):- !,
    write('O1,O3  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,X,K2,O2,K3,O3,K4,X), state(K1,Y,K2,O2,K3,O3,K4,Y) ):- !,
    write('O1,O4  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,X,O2,K3,O3,K4,O4), state(K1,O1,Y,O2,K3,O3,K4,O4) ):- !,
    write('K2     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,X,X,K3,O3,K4,O4), state(K1,O1,Y,Y,K3,O3,K4,O4) ):- !,
    write('K2,O2  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,X,O2,X,O3,K4,O4), state(K1,O1,Y,O2,Y,O3,K4,O4) ):- !,
    write('K2,K3  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,X,O2,K3,O3,X,O4), state(K1,O1,Y,O2,K3,O3,Y,O4) ):- !,
    write('K2,K4  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,X,K3,O3,K4,O4), state(K1,O1,K2,Y,K3,O3,K4,O4) ):- !,
    write('O2     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,X,K3,X,K4,O4), state(K1,O1,K2,Y,K3,Y,K4,O4) ):- !,
    write('O2,O3  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,X,K3,O3,K4,X), state(K1,O1,K2,Y,K3,O3,K4,Y) ):- !,
    write('O2,O4  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,X,O3,K4,O4), state(K1,O1,K2,O2,Y,O3,K4,O4) ):- !,
    write('K3     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,X,X,K4,O4), state(K1,O1,K2,O2,Y,Y,K4,O4) ):- !,
    write('K3,O3  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,X,O3,X,O4), state(K1,O1,K2,O2,Y,O3,Y,O4) ):- !,
    write('K3,K4  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,X,K4,O4), state(K1,O1,K2,O2,K3,Y,K4,O4) ):- !,
    write('O3     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,X,K4,X), state(K1,O1,K2,O2,K3,Y,K4,Y) ):- !,
    write('O3,O4  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,O3,X,O4), state(K1,O1,K2,O2,K3,O3,Y,O4) ):- !,
    write('K4     '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,O3,X,X), state(K1,O1,K2,O2,K3,O3,Y,Y) ):- !,
    write('K4,O4  '),
    write(X),
    write(' ->> '),
    write(Y),nl. 
write_move(state(K1,O1,K2,O2,K3,O3,K4,X), state(K1,O1,K2,O2,K3,O3,K4,Y) ):- !,
    write('O4     '),
    write(X),
    write(' ->> '),
    write(Y),nl.
Результат:

Код:
O2,O4  1 ->> 2
O2     2 ->> 1
K1,O1  1 ->> 2
O1,O4  2 ->> 1
O1,O2  1 ->> 2
K1,O1  2 ->> 1
K3,O3  1 ->> 2
O2,O3  2 ->> 1
O1,O3  1 ->> 2
K3,O3  2 ->> 1
K2,O2  1 ->> 2
O1,O2  2 ->> 1
O2,O3  1 ->> 2
K2,O2  2 ->> 1
K1,O1  1 ->> 2
K1     2 ->> 1
K2,O2  1 ->> 2
O1,O3  2 ->> 1
O1,O4  1 ->> 2
K2,O2  2 ->> 1
K3,O3  1 ->> 2
O1,O4  2 ->> 1
O1,O2  1 ->> 2
K3,O3  2 ->> 1
K4,O4  1 ->> 2
O1,O2  2 ->> 1
K1,O1  1 ->> 2
O4     2 ->> 1
K2,K3  1 ->> 2
K2,K4  2 ->> 1
O3,O4  1 ->> 2
K1,K3  2 ->> 1
K1,K4  1 ->> 2
O1,O3  2 ->> 1
O1,O2  1 ->> 2
K1,K4  2 ->> 1
K1,K2  1 ->> 2
O1,O4  2 ->> 1
O1,O3  1 ->> 2
K1,K2  2 ->> 1
K1,K3  1 ->> 2
O2     2 ->> 1
K2,K4  1 ->> 2
O1     2 ->> 1
O1,O2  1 ->> 2
K3,O3  2 ->> 1
O3,O4  1 ->> 2
O1,O3  2 ->> 1
K3     1 ->> 2
K1,K3  2 ->> 1
K1,O1  1 ->> 2
O1,O2  2 ->> 1
K3,O3  1 ->> 2
K1,K2  2 ->> 1
K1,O1  1 ->> 2
O1,O4  2 ->> 1
K2,O2  1 ->> 2
K1,K4  2 ->> 1
K1,O1  1 ->> 2
K3,O3  2 ->> 1
O3,O4  1 ->> 2
K1,K2  2 ->> 1
K1     1 ->> 2
K1,O1  2 ->> 1
K2,K4  1 ->> 2
O2,O3  2 ->> 1
O1,O2  1 ->> 2
O1,O4  2 ->> 1
K1,K3  1 ->> 2
K1     2 ->> 1
K1,O1  1 ->> 2
O1,O2  2 ->> 1
O1,O4  1 ->> 2
O1     2 ->> 1
O1,O3  1 ->> 2
K1,O1  2 ->> 1
O1,O2  1 ->> 2
O1,O3  2 ->> 1
K1,O1  1 ->> 2
K2,O2  2 ->> 1
O2,O3  1 ->> 2
O1,O2  2 ->> 1
K2,O2  1 ->> 2
K1     2 ->> 1
K1,O1  1 ->> 2
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача о перевозке (волк, коза, капуста) методом в ширину Vit86 Prolog 9 05.12.2012 21:21
Помогите, задача по прологу, срочно...задача с высказываниями 4ixOn Prolog 6 10.07.2011 23:29
Помогите, задача по прологу, срочно...задача о станках 4ixOn Prolog 3 09.07.2011 22:48
Волк, коза, капуста (навороты) kulikov_s Prolog 15 12.12.2010 23:09
волк, коза, капуста в стране восходящего солнца))) aag Prolog 19 08.10.2010 03:47
задача о перевозке(волк,коза,капуста) поиском в глубину yurbass Prolog 12 29.03.2009 14:29
Переправа толстых через реку Винитарх Prolog 3 17.02.2007 02:03
Волк, коза и капуста (срочно) Вастич Prolog 1 23.12.2006 18:32
Волк Коза Капуста (по просьбе Сергея) Alexei A. Morozov Prolog 3 24.10.2005 19:01
Перевозка через реку AlexMaa Prolog 3 14.06.2005 05:53
Волк, коза, капуста. Поиск в ШИРИНУ imported_Goodman Prolog 3 03.06.2005 12:30



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов