我目前正在为一个班级学习 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 手册有点难以理解。
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,从CLASSINFOX是Y。您可以添加其他信息,例如教师必须是教授。您可以通过,在谓词之间放置 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)
好的,所以这些是一些如何玩的例子。我希望这足以帮助您解决第二条规则。