在Prolog表中查找X

在Prolog表中查找X,prolog,Prolog,如何让Prolog代码返回数据库中的某些内容,而不是只回答yes和no 我有这张小桌子 student('Pelt', '67890'). grade('PH100', '67890', 'C plus'). 当我传入'Pelt'时,如何编写返回'C plus'的查找函数?这就是我所拥有的,但我认为它不会有任何进展 lookupGrade(X) :- student(X, Y), grade(W, Y, Z). Prolog规则不会以C函数的形式返回值 在您想要提取学生的成绩时,您应该将两个

如何让Prolog代码返回数据库中的某些内容,而不是只回答yes和no

我有这张小桌子

student('Pelt', '67890').
grade('PH100', '67890', 'C plus').
当我传入'Pelt'时,如何编写返回'C plus'的查找函数?这就是我所拥有的,但我认为它不会有任何进展

lookupGrade(X) :- student(X, Y), grade(W, Y, Z).

Prolog规则不会以C函数的形式返回值

在您想要提取学生的成绩时,您应该将两个元素传递给您的lookupGrade;但来自Mat的建议;谢谢,我在学生年级改了名字,原因在最后解释

规则可能是这样的

student_grade(Name, Grade) :- student(Name, Code), grade(_, Code, Grade).
将其用作

 student_grade('Pelt', G)
在G中统一值‘C加’

请注意,此规则也适用于相反方向;与

 student_grade(N, 'C plus')
你在N中统一了“毛皮”


这就是为什么lookupGrade是一个坏名字的原因:如果您传递一个atom作为名称,传递一个变量作为等级,那么它可以是一个查找等级;如果您将atom作为成绩传递,将变量作为名称传递,则可以成为查找学生;可以与findall/3一起使用,举例来说,如果向其传递两个变量,则用于查找所有匹配的学生/成绩。

Prolog规则不会将值作为C函数返回

在您想要提取学生的成绩时,您应该将两个元素传递给您的lookupGrade;但来自Mat的建议;谢谢,我在学生年级改了名字,原因在最后解释

规则可能是这样的

student_grade(Name, Grade) :- student(Name, Code), grade(_, Code, Grade).
将其用作

 student_grade('Pelt', G)
在G中统一值‘C加’

请注意,此规则也适用于相反方向;与

 student_grade(N, 'C plus')
你在N中统一了“毛皮”


这就是为什么lookupGrade是一个坏名字的原因:如果您传递一个atom作为名称,传递一个变量作为等级,那么它可以是一个查找等级;如果您将atom作为成绩传递,将变量作为名称传递,则可以成为查找学生;可以与findall/3一起使用,例如,如果您向其传递两个变量,则用于查找所有匹配的学生/成绩。

请扩展名称:如果成绩已实例化,则lookupGrade没有意义,它位于查询中,如:lookupGrade'Pelt',C plus'和lookupGrade_Ua'。我建议学生2年级。这在各个方面都有意义。@mat-你说得对;谢谢修改了我的答案。考虑到我在英语方面有很大的困难,而且我是Prolog的新手,所以如果你想编辑我的答案,请毫不犹豫。很棒的编辑,+1!我不想编辑这样的答案,但首先与作者讨论一下,这样我们双方都会受益。请详细说明名称:如果等级已经实例化,则lookupGrade没有意义,在查询中如:lookupGrade'Pelt',C plus'和lookupGrade'a'。我建议学生2年级。这在各个方面都有意义。@mat-你说得对;谢谢修改了我的答案。考虑到我在英语方面有很大的困难,而且我是Prolog的新手,所以如果你想编辑我的答案,请毫不犹豫。很棒的编辑,+1!我不想编辑这些答案,而是先和作者讨论一下,这样我们双方都会受益。