如何让我的Prolog代码返回数据库中的内容,而不是仅仅回答yes
和no
?
我有这张小桌子
student('Pelt', '67890').
grade('PH100', '67890', 'C plus').
当我传入'C plus'
时,如何编写一个返回'Pelt'
的查找函数?这就是我所拥有的,但我不认为它会去任何地方。
lookupGrade(X) :- student(X, Y), grade(W, Y, Z).
答案 0 :(得分:4)
Prolog规则不会将值作为C函数返回。
在您想要提取学生的成绩时,您应该将两个要素传递给lookupGrade
;但是(来自Mat的建议;谢谢)我在student_grade
中更改了名称(原因在最后解释)。
规则可能类似
student_grade(Name, Grade) :- student(Name, Code), grade(_, Code, Grade).
将其用作
student_grade('Pelt', G)
您在G
'C plus'
中“统一”了值 student_grade(N, 'C plus')
。
请注意,此规则的作用方向相反;与
'Pelt'
您在N
中统一lookupGrade
。
这就是为什么findall/3
是一个坏名字的原因:如果你传递一个原子作为名称和一个等级变量,它可以是一个“查找等级”;如果你传递一个原子作为等级和一个变量的名字,可以是一个“查找学生”;可以(以{{1}}为例,例如)用于查找所有匹配的学生/成绩,如果你传递给它两个变量。