从 Prolog 中的事实中检索元素

und*_*mer 1 prolog

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

?- class_info(steve, Y). 
Y = math ;
false.
Run Code Online (Sandbox Code Playgroud)

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

假设我有以下事实。

/*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 ';'
 .
     
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。我不是在寻找代码,而是在寻找指向正确方向的东西。Prolog GNU 手册有点难以理解。

DuD*_*uDa 5

class_info(X, Y) :-
    teaches(X, Y).

?- class_info(steve,Y).
Y = math ;
false.
Run Code Online (Sandbox Code Playgroud)

好的,很抱歉将一个解决方案放在首位,但是没有示例就很难掌握 Prolog。所以我只提出第一个解决方案,第二个你必须通过一些解释来弄清楚。

所以你要问哪个讲师X上哪门课Y。您已经在 中拥有此信息teaches/2,因此您只需转发此谓词中的值。所以说像,如果一个老师X教的讲座Y,从CLASSINFOXY。您可以添加其他信息,例如教师必须是教授。您可以通过,在谓词之间放置 a来执行“和”(连词):

class_info(X, Y) :-
    teaches(X, Y),
    job(X, professor).

?- class_info(steve,Y).
Y = math ;
false.
Run Code Online (Sandbox Code Playgroud)

请注意变量以大写字母开头。问题以 开头?-,答案用分号分隔,;直到没有解决方案为止 ( 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.
Run Code Online (Sandbox Code Playgroud)

好的,所以这些是一些如何玩的例子。我希望这足以帮助您解决第二条规则。