% end once the input is empty
find_gender([], _, []).
% Compare the first 4 "entries" in the list.
% Name and Gender are variables, b/c they are written in upper case.
% 'is' and 'a' are atom.
% If the pattern matches, prepend the Name to the results.
find_gender([Name,is,a,Gender|Tail], Gender, [Name|Names]) :-
% Find further Names in the Tail of the input list.
find_gender(Tail, Gender, Names).
% The person is not of that Gender.
% You don't need to catch the Name here, b/c it won't be used.
find_gender([_,is,a,X|Tail], Gender, Names) :-
X \= Gender, % otherwise you would have wrong results when backtracking
find_gender(Tail, Gender, Names).
% This is your usage example:
find_women(List, Names) :-
find_gender(List, woman, Names).
find_men(List, Names) :-
find_gender(List, man, Names).
Реверс работает хорошо:
?- find_women(List, [jane,marry]).
List = [jane, is, a, woman, marry, is, a, woman] ;
false.
Если список ввода может содержать другие данные, как в [jane,owns,a,car,jane,is,a,woman,the,car,is,red]
, то вы можете просто удалить записи, пока вы не найдете свой рисунок снова, добавив этот пункт:
find_gender([_|T], Gender, Names) :-
find_gender(T, Gender, Names).
Но это приведет к нескольким результатам при обратном отслеживании, с некоторыми пропущенными именами. Возможно, вы захотите ввести разрезы (!
) в первых предложениях в этом случае.
Какой "алгоритм" (ну, в декларативный смысл), о чем вы думали? Потому что, вы знаете, для нас важно быть уверенным, что наш ответ не помешает вам подумать о назначении вашего класса ... –
Я бы подумал, что это более пролог-y, чтобы перебирать список фактов - то есть ' [женщина (mary), мужчина (dom), женщина (jane)] ', так что предикат подразумевает, что mary - женщина. Является ли этот список слов ограничением? –
«Гуглинг в течение нескольких часов» для ответа, не изучая язык и тратя время на то, чтобы попробовать что-то, не является оптимальным путем для изучения. Это не очень изящный сценарий, но на мгновение он не будет «искать список» для таких вещей, как 'is, a, woman', что является императивным способом взглянуть на него. Если ваша структура списка действительно такая строгая, вы можете (хотя и негибко), например, использовать шаблон, такой как '[X, is, a, woman | T]', чтобы выбрать женщину из передней части списка и записаться на 'T'. – lurker