2011-11-14 61 views
1

为了用事实一个约会数据库的形式:Prolog的数据库查询

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). 

但我似乎没有运气。有没有我失踪的功能或我实施错误的东西?

+0

我认为你缺少下列情况下'edu_lesser(A,B): - edu_less(A,B).' –

回答

2

我认为你几乎是正确的。试试这个:

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). 
+0

对不起,我忘了说我也有这个关系成立: edu_less(hs,bacherlor)。 edu_less(学士,硕士)。 edu_lesser(A,B): - edu_less(A,X), edu_lesser(X,B)。 如何使女性的datable函数返回男性,而不是硬编码? 谢谢! – user971840

+0

你是什么意思?您可以删除第二个“反向”功能。并调用datable(男,女)。它应该返回所有匹配的对。 –

+0

我的意思是说输入可能不总是男性,但我认为你用反向函数来说明了这一点。对不起,我刚刚学了Prolog。 – user971840