сравнивая значения нескольких фактов друг с другом в прологе - PullRequest
0 голосов
/ 19 октября 2018
 workers(name(nasrin,sultana),eng,address(dhanmondi,city1,bangladesh),40).
 workers(name(kabita,chy),doctor,address(motijheel,city1,bangladesh),35).
 workers(name(nasima,akter),lecturer,address(agrabad,city2,bangladesh),30).
 workers(name(afroja,sultana),doctor,address(gec,city2,bangladesh),45).
 samecity(F,L):-
 workers(name(_,_),_,address(_,A,_),_),         
 workers(name(F,L),_,address(_,A,_),_).

мой запрос: кто живет в том же городе? Я написал правило, зная, что он не будет работать для этого запроса, но не смог создать точное правило для запроса.

1 Ответ

0 голосов
/ 20 октября 2018

Я дам вам стартовый процесс.

Поскольку у вас может быть несколько решений "всех имен, которые живут в одном городе" (поскольку это может быть верно для нескольких городов), тогда я '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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...