Ответ в теме: Влюбленные юноши и девушки (Turbo и SWI Prolog)

      Комментарии к записи Ответ в теме: Влюбленные юноши и девушки (Turbo и SWI Prolog) отключены
#2430

PROger4ever
Участник

Спасибо большое Владимиру за решение задачи и написание на двух диалектах.

domains
love_d=love(string, string)
love_list_d=love_d*
string_list_d=string*
predicates
nondeterm male(string) % мальчики
nondeterm female(string) % девочки
% Решение задачи
nondeterm solve_love_problem(love_list_d)
nondeterm printPairs(love_list_d)
nondeterm printPair(love_d)
print
unique(string_list_d)
not_reciprocity(love_list_d)
nondeterm member(love_d, love_list_d)
nondeterm member(string, string_list_d).
clauses
male("Kolya").
male("Dima").
male("Yura").
female("Anya").
female("Lena").
female("Vika").
not_reciprocity(Solution):-
member(love(Boy, Girl), Solution), 
member(love(Girl, Boy), Solution), !, fail; !.
solve_love_problem(Solution):-
% переменные для девушек парней
female(KolyaGirl), female(DimaGirl), female(YuraGirl),
% переменные для парней девушек
male(AnyaBoy), male(LenaBoy), male(VikaBoy),
/* задаём пары, где первый элемент - парень/девушка,
а второй - искомая перемнная.*/
Solution = [
love("Kolya", KolyaGirl),
love("Dima", DimaGirl),
love("Yura", YuraGirl),
love("Anya", AnyaBoy),
love("Lena", LenaBoy),
love("Vika", VikaBoy)
],
% генерация всех возможных вариантов
Girls = [KolyaGirl, DimaGirl, YuraGirl],
Boys = [AnyaBoy, LenaBoy, VikaBoy],
% не даём любить нескольким одну и ту же девушку/парня.
unique(Girls), unique(Boys),
% оставляем только не взаимные варианты
not_reciprocity(Solution),
% Добавляем условия.
% Коля любит девушку, влюбленную в юношу, который любит Лену.
member(love(BoyLoveLena, "Lena"), Solution), 
member(love(GirlLoveBoyLoveLena, BoyLoveLena), Solution), 
member(love("Kolya", GirlLoveBoyLoveLena), Solution), 
% Дима любит девушку, влюбленную в юношу, который любит Вику.
member(love(BoyLoveVika, "Vika"), Solution), 
member(love(GirlLoveBoyLoveVika, BoyLoveVika), Solution),
member(love("Dima", GirlLoveBoyLoveVika), Solution),
% Лена не любит Юру.
NOT(member(love("Lena", "Yura"), Solution)).
unique([]):-!.
unique([Head|Tail]):-
member(Head, Tail), !, fail;
unique(Tail).
member(Elem, [Elem|_Tail]).
member(Elem, [_Head|Tail]):-
member(Elem, Tail).
printPairs([]):-!.
printPairs([Head|Tail]):-
printPair(Head),
printPairs(Tail).
printPair(love(Human1, Human2)):-
write(Human1, " lybit ", Human2), nl.
print:-
% Решаем задачу
solve_love_problem(X),
printPairs(X).