Запрос к базе данных Prolog - PullRequest
1 голос
/ 14 ноября 2011

Создать базу данных знакомств с фактами в виде:

person(name, age, sex, height, weight, education, salary)

С учетом ввода:

datable(alex, X).

datable_weight_limit(alex, 170, X). Где 170 - порог для веса

Как я могу вернуть имена потенциальных совпадений с правилами:

  1. Могут быть сопоставлены только противоположные полы
  2. Мужчины должны быть старше женщин
  3. Мужчины должны иметь высшее образование, чем женщины?

У меня настроены эти отношения:

edu_less(hs, bachelor).
edu_less(bachelor, master).
edu_less(master, phd).

edu_lesser(A, B):-
    edu_less(A, X),
    edu_lesser(X, B).

Я пробовал:

datable(X, Y):-

    person(X, Agel, Sexl, Heightl, Weightl, Educationl, Salaryl),

    person(Namem, Agem, Sexm, Heightm, Weightm, Educationm, Salarym),

    Sexm \== Sexl.

datable(X, Y):-

    person(X, Agel, Sexl, Heightl, Weightl, Educationl, Salaryl),

    Sexl == female,

    findall( X, person(X, _, male, _, _, _, _), Y).

Но мне, кажется, не повезло.Есть ли какая-то функция, которую я пропускаю или что-то неправильно реализую?

1 Ответ

2 голосов
/ 14 ноября 2011

Я думаю, что вы почти правы.Попробуйте это:

datable(M, F):-
    person(M, AgeM, male, HeightM, WeightM, EducationM, SalaryM),
    person(F, AgeF, female, HeightF, WeightF, EducationF, SalaryF),
    AgeM >= AgeF,
    edu_lesser(EducationF, EducationM),
    datable_weight_limit(M, MaxWeight),
    MaxWeight >= WeightF. 

Здесь мы предполагаем, что образование это также числаЕсли вам нужна также функция - datable(F,M):

datable(F,M) :-
     person(F, _, female, _, _, _, _),
     datable(M, F).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...