从Prolog中的事实检索元素



我现在正在为一个班学习Prolog。我使用GNU Prolog来定义一个规则,例如class_info(X,Y)和一个类似的规则,其中X是教授的名字,Y将是信息的输出。例如:

?- class_info(steve, Y). 
Y = math ;
false.

但我只知道如何在规则中返回代数表达式,而不知道上面的那个。

假设我有以下事实。

/*facts */
job(steve, professor).
job(john, professor).
teaches(steve, math).
teaches(john, chemistry).
class(math, calculus).
class(chemistry, organic).
class(math, algebra).
class(chemistry, basic).

%rule
class_info(X, Y) :-
%absolutely have no idea what do here, 'is' does not work, since it's only for algebraic expressions
.
exact_class(X, Y) :-
%exact_class(steve, Y). returns Y = calculus? and Y = algebra upon pressing ';'
.

如有任何帮助,我们将不胜感激。我不是在寻找代码,而是一些能给我指明正确方向的东西。Prolog GNU手册有点难以遵循。

class_info(X, Y) :-
teaches(X, Y).
?- class_info(steve,Y).
Y = math ;
false.

好的,很抱歉把一个解决方案放在首位,但如果没有例子,Prolog很难理解。所以我只提出了第一个解决方案,第二个你必须通过一些解释来解决。

所以你在问哪个讲师X主持哪个课程Y。您在teaches/2中已经有了这个信息,所以您只需转发这个谓词中的值。所以它说了类似于的东西,如果一个老师X教授讲座Y,那么来自X的类信息就是Y。你可以添加附加信息,例如老师必须是教授。你这样做"以及";(连词(通过在谓词之间放置,

class_info(X, Y) :-
teaches(X, Y),
job(X, professor).
?- class_info(steve,Y).
Y = math ;
false.

请注意,变量以大写字母开头。从?-开始提问,答案用分号;分隔,直到没有答案为止(false.(。

你甚至可以通过使用一个谓词来更具体地说明这一点,该谓词也转发讲师的工作:

class_info_job(X, Y, Z) :-
teaches(X, Y),
job(X, Z).
?- class_info_job (steve, Y, Z).
Y = math,
Z = professor ; 
false.
?- class_info_job (steve, Y, professor).
Y = math; 
false.
?- class_info_job(X, math, Z).
X = steve,
Z = professor ;
false. 
?- class_info_job(X, Y, Z).
X = steve,
Y = math,
Z = professor ;
X = john,
Y = chemistry,
Z = professor ;
false.

好的,下面是一些如何玩的例子。我希望这足以帮助你理解第二条规则。

最新更新