Ответ в теме: Влюбленные юноши и девушки (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).