Я дам вам стартовый процесс.
Поскольку у вас может быть несколько решений "всех имен, которые живут в одном городе" (поскольку это может быть верно для нескольких городов), тогда я 'd предлагает написать предикат следующей формы:
same_city(City, NameList).
Теперь вы можете сосредоточиться на написании этого предиката, поскольку аргументы состоят из одного города и предоставят список из одного или нескольких имен:
same_city(City, NameList) :-
findall(Name, workers(...), NameList)).
Я оставлю это вам, чтобы заполнить ...
.
Теперь это даст вам решения, которые даже имеют одно имя в данном городе.Если вы хотите, чтобы это было успешным только для городов с как минимум двумя именами, вам нужно указать это условие:
at_least_two_same_city(City, NameList) :-
findall(Name, workers(...), NameList)),
length(NameList, NumberOfNames),
NumberOfNames > 1.
Еще один способ обеспечить список длиной> 1 - использовать форму [_,_|_]
длясписок, который составляет более точное решение:
at_least_two_same_city(City, NameList) :-
NameList = [_,_|_], % We only want lists with at least 2 members
findall(Name, workers(...), NameList)).
Наконец, если вы хотите, чтобы все решения для этого предиката, вы могли бы снова использовать findall/3
для этого предиката:
findall(City-NameList, at_least_two_same_city(City, NameList), AllMultipleNameCitiesAndNames).