
Завдання 1
Створитиавтоматизовану СПР, за допомогоюякоїнеобхідновирішитинаступну задачу.
На одній вулиці стоять 4 будинки. В кожному з них живуть 4 мешканці: Семен, Микола, Артур та Роман. Кожен з них володіє однією із наступних професій: Лікар, Художник, Єгер та Тренер. Визначити, в якому будинку проживає кожен з мешканців і хто якою професією володіє.
Відомінаступніфакти:
1) Художник живепоряд з тренером
2) Лікарживепоряд з художником
3) Єгерживелівіше за лікаря
4) Тренер живе не поряд з Єгерєм
5) Художник живезправавід Семена
6) Роман не є тренером
7) Семен живепоряд з Миколою
8) Артур живе не поряд з Романом
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(_).
Завдання 2
Створитиавтоматизовану СПР, за допомогоюякоїнеобхідновирішитинаступну задачу.
У приміщенні банку в одну лінію розміщено 4 робочі місця. Працівників, які займають ці місця, зовуть наступним чином: Світлана, Анжела, Маріанна та Денис. Кожен з них обіймає певну посаду: Директор відділення, Операціоніст, Кредитний менеджер та Депозитний менеджер. Визначити, на якому робочому місці знаходиться кожен із робітників та яку посаду обіймає, якщо про них відомі наступні факти:
Відомінаступніфакти:
1) Світланазнаходитьсяпоряд Анжелою
2) Денис не є Депозитним менеджером
3) Кредитний менеджер знаходитьсялівіше за Директора відділення
4) Депозитний менеджер розміщений не поряд з Кредитним менеджером
5)Директор відділеннязнаходитьсяпоряд з Операціоністом
6)ОпераціоністрозміщенийзправавідСвітлани
7) Операціоністрозміщенийпоряд з Депозитним менеджером
8)Маріанназнаходитьсяне поряд з Денисом
робочие_места([
робочее_место(first, _, _ ),
робочее_место(second, _, _ ),
робочее_место(third, _, _ ),
робочее_место(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).
Продовження лістингу 1.1– Код програми
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_депозитный_менеджер(H):-mymember(робочее_место(_,денис,директор_отделения),H).
not_депозитный_менеджер(H):-mymember(робочее_место(_,денис,операционист),H).
not_депозитный_менеджер(H):-mymember(робочее_место(_,денис,кредитный_менеджер),H).
not_депозитный_менеджер(H):-mymember(робочее_место(_,денис, депозитный_менеджер),H),!,fail.
print_робочие_места([]).
print_робочие_места([A|B]) :-
write(A), nl,
print_робочие_места(B).
false(X):-X,!,fail.
false(_).
solve(H):-робочие_места(H), next_to(робочее_место(_,светлана,_),
робочее_место(_,анжела, _),H),
next_to(робочее_место(_,_, директор_отделения),
робочее_место(_,_ , операционист),H),
left_of(робочее_место(_,_, кредитный_менеджер),
робочее_место(_,_, директор_отделения),H),
false(next_to(робочее_место(_,денис,_),
робочее_место(_,_,депозитный_менеджер),H)),
false(next_to(робочее_место(_,мариана,_),
робочее_место(_,денис, _),H)), right_of(робочее_место(_,_, операционист),
робочее_место(_, светлана, _),H),
next_to(робочее_место(_,_, операционист),
робочее_место(_,_, депозитный_менеджер),H),
false(next_to(робочее_место(_,_, депозитный_менеджер), робочее_место(_,_, кредитный_менеджер),H )),
not_депозитный_менеджер(H),
mymember(робочее_место(_,светлана,_), H),
mymember(робочее_место(_,анжела,_), H),
mymember(робочее_место(_,мариана,_), H)
mymember(робочее_место(_,денис,_), H), print_робочие_места(H).
:-solve(_).