Логическое программирование в ограничениях - Prolog

Формулировка задачи:

Всем доброго времени суток! Прошу помощи) Люди добрые, кто понимает SWI Prolog, не могли бы вы прокомментировать код? Очень нужно разобраться. Я не во всех местах понимаю, что происходит И не подскажете как правильно написать запрос? что-то у меня не хочет работать Прога вот этой задачи: На одной улице стоят 4 дома. В каждом из них живет один из 4-х людей: Семен, Николай, Артур и Роман. Каждый из них владеет профессией: Врач, Художник, Егерь, Тренер. Определить кто в каком доме живет и кто какой профессией владеет. Известно, что: Художник живет рядом с тренером Врач живет рядом с Художником Егерь левее врача Тренер не рядом с Егерем Художник правее Семена Роман не тренер Семен рядом с Николаем Артур не рядом с Романом
houses([ house(first, _, _ ), house(second, _, _ ), house(third, _, _ ), house(forth, _, _ ) ]). 
 
left_of(A, B, [A, B | _]). 
left_of(A, B, [_ | Y]) :- left_of(A, B, Y). 
 
right_of(A, B, [B, A | _]). 
right_of(A, B, [_ | Y]) :- right_of(A, B, Y). 
 
next_to(A, B, [A, B | _]).
 next_to(A, B, [B, A | _]). 
next_to(A, B, [_ | Y]) :- next_to(A, B, Y). 
 
mymember(X, [X|_]). 
mymember(X, [_|Y]) :- mymember(X, Y). 
 
not_in(_,[]). 
not_in(X,[X|_]):-!,fail. 
not_in(X,[_|A]):-not_in(X,A). 
 
not_trainer(H):-mymember(house(_,roman,hunter),H). 
not_trainer(H):-mymember(house(_,roman,doctor),H). 
not_trainer(H):-mymember(house(_,roman,painter),H). 
not_trainer(H):-mymember(house(_,roman,trainer),H),!,fail. 
 
print_houses([]). 
print_houses([A|B]) :- write(A), nl, print_houses(B). 
 
false(X):-X,!,fail. false(_). 
 
solve(H):-houses(H), next_to(house(_,_,painter), house(_,_,trainer),H), 
next_to(house(_,_,doctor), house(_,_,painter),H), 
left_of(house(_,_,hunter), house(_,_,doctor),H),
false(next_to(house(_,_,trainer), house(_,_,hunter),H)), 
right_of(house(_,_,painter), house(_,semen,_),H), 
next_to(house(_,semen,_), house(_,nikolay,_),H), 
false(next_to(house(_,artur,_), house(_,roman,_),H )), 
not_trainer(H), mymember(house(_,roman,_), H), 
mymember(house(_,artur,_), H), mymember(house(_,semen,_), H), 
mymember(house(_,nikolay,_), H), print_houses(H). :-solve(_).


textual

Код к задаче: «Логическое программирование в ограничениях - Prolog»

?- man_prof(MP).
MP = ['Роман'-'Егерь', 'Семен'-'Врач', 'Николай'-'Художник', 'Артур'-'Тренер'] ;
false.
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

5   голосов, оценка 4.000 из 5

Источник