Database Prolog数据库查询

Database Prolog数据库查询,database,comparison,prolog,Database,Comparison,Prolog,以以下形式制作包含事实的约会数据库: 人(姓名、年龄、性别、身高、体重、教育程度、工资) 鉴于以下方面的投入: datable(alex,X)。 datable\u weight\u limit(alex,170,X)。其中170是重量的阈值 如何返回具有规则的潜在匹配项的名称: 只有异性才能配对 男性应该比女性大 男性应该比女性接受更高的教育 我已经建立了这些关系: edu_less(hs, bachelor). edu_less(bachelor, master). edu_less(mas

以以下形式制作包含事实的约会数据库:

人(姓名、年龄、性别、身高、体重、教育程度、工资)

鉴于以下方面的投入:

datable(alex,X)。

datable\u weight\u limit(alex,170,X)。
其中170是重量的阈值

如何返回具有规则的潜在匹配项的名称:

  • 只有异性才能配对
  • 男性应该比女性大
  • 男性应该比女性接受更高的教育
  • 我已经建立了这些关系:

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

    但我似乎没有运气。是否有我缺少的功能或我实现的某些功能出错?

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

    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. 
    
    在这里我们假设,教育也是数字。 如果您还需要函数-
    数据表(F,M)


    对不起,我忘了提到我也建立了这个关系:edu_less(hs,bacherlor)。无学历(学士、硕士)。小教育(A,B):-edu_-less(A,X),edu-less(X,B)。我怎样才能使datable函数为女性返回男性,而不是硬编码呢?谢谢什么意思?您可以删除第二个“反转”功能。并调用数据表(男,女)。它应该返回所有匹配的对。我的意思是输入可能不总是男性,但我想你已经用反向函数覆盖了这一点。对不起,我昨天刚学了序言。如果你对性有不同的输入,你可以用
    SexM=/=SexF
    代替男性/女性,就像你所做的那样。你的代码似乎在看两个人是否匹配。如何返回数据库中匹配人员的姓名?例如,如果您输入datable(alex,X)。它将返回X=贝蒂、萨曼莎等?谢谢,我认为您缺少以下案例
    edu_less(A,B):-edu_less(A,B)。
    datable(F,M) :-
         person(F, _, female, _, _, _, _),
         datable(M, F).