在prolog中访问关系

在prolog中访问关系,prolog,relation,relational,Prolog,Relation,Relational,在我的离散数学课程中,我们有一个单独的序言作业,如下所示 创建一个模拟学生、班级、房间、日期和时间的程序 他们的关系。包括相关功能 我最初的想法是需要生成大量的数据,我仍然很好奇这个任务是否可以在不显式映射每个关系的情况下完成 显然,似乎有两种策略,一种是使用图形(似乎很复杂),另一种是使用映射策略关系(value,value2)(我想称之为谓词,但我不确定这是否正确) 然而,我似乎不知道如何访问规则内的关系?(我的意思是:-语法,在我看来更像是函数而不是规则) 我觉得我好像在走旁道,我在寻找解

在我的离散数学课程中,我们有一个单独的序言作业,如下所示

创建一个模拟学生、班级、房间、日期和时间的程序 他们的关系。包括相关功能

我最初的想法是需要生成大量的数据,我仍然很好奇这个任务是否可以在不显式映射每个关系的情况下完成

显然,似乎有两种策略,一种是使用图形(似乎很复杂),另一种是使用映射策略
关系(value,value2)
(我想称之为谓词,但我不确定这是否正确)

然而,我似乎不知道如何访问规则内的关系?(我的意思是:-语法,在我看来更像是函数而不是规则)

我觉得我好像在走旁道,我在寻找解决这个问题所需的信息时遇到了问题,因为我对术语有困难

%student(name, class, semester)
student(søren, 101, 1).
student(jens, 101, 1).
student(peter, 101, 2).
student(eskild, 101, 1).
student(jørgen, 101, 2).
student(signe, 101, 1).
student(pernille, 101, 2).
student(katrine, 101, 2).
student(sophie, 101, 1).
student(liva, 101, 1).
%semester_subjects(semester, subject)
semester_subjects(2, DM).
semester_subjects(1, test).
semester_subjects(2, BI).
semester_subjects(1, SI).
semester_subjects(1, LSD).
semester_subjects(2, SI).
semester_subjects(2, LSD).
%class(name, subject)
class(101, DM).
class(101, test).
class(101, SI).
class(101, LSD).
class(101, BI).
%schedule(weekday(0-6), subject)
schedule(0, test).
schedule(1, test).
schedule(1, BI).
schedule(2, SI).
schedule(2, LSD).
schedule(4, DM).

%has_class_today(student_name, day) :-.
%has_sudent(class, student_name) :-.
%has_subject(student_name, subject_name) :-.
我觉得我应该可以做一些像

has_class_today(student_name, day) :- {
    Class = student(søren).class
    Semester = student(søren).semester
    SemesterSubjects = semester_subjects.forAll( if(semester == Semester) return subject)
    SubjectsToday = schedule(day).forAll(if(SemesterSubjects.includes(subject))
    if(SubjectsToday > 0) return true
    else return false                               
}
但我真的不知道该怎么做。总结一下我的问题

我当前的aproach是否应该工作?如何根据一个关系(Peter Susan)检索另一个关系的值?
如果我目前的方法不起作用,您会建议如何处理这项难以解释且至少需要2小时指导的任务

这是一个标准的数据库建模任务

你有“对象”

  • 具有属性名称、班级、学期的学生
它由Prolog中的谓词
student/3
建模。在中,这称为关系或表

看起来不一样(想象它是表格形式),但是。。。同样的事情

你有“省略对象”

  • 属性为“学期id”且值为1或2的学期
  • 具有属性subject name的subject,具有值
    DM
    test
未使用谓词显式列出的(尽管这是可能的,建议根据应用程序而定),如中所示:

相反,这些对象通过在它们之间提供一个2位关系来隐式列出

  • 通过学期课程与科目相关的学期
这是通过谓词(aka关系)建模的

等等

(注意,您的代码是错误的。Prolog将考虑以大写字母作为变量开始的任何内容,因此必须键入<代码>”DM“<代码> >或<代码> DM“< /代码>,而不是<代码> DM < /代码>)

转到并输入您的数据

% The student relation: student(name, class, semester)
% A predicate made up by a set of facts.

student('søren', 101, 1).
student('jens', 101, 1).
student('peter', 101, 2).
student('eskild', 101, 1).
student('jørgen', 101, 2).
student('signe', 101, 1).
student('pernille', 101, 2).
student('katrine', 101, 2).
student('sophie', 101, 1).
student('liva', 101, 1).

% The relation expressing the connection/relationship  
% between semester and subjects
% semester_subjects(semester, subject)
% A predicate made up by a set of facts.

semester_subjects(2, 'DM').
semester_subjects(1, 'test').
semester_subjects(2, 'BI').
semester_subjects(1, 'SI').
semester_subjects(1, 'LSD').
semester_subjects(2, 'SI').
semester_subjects(2, 'LSD').

% The relation expressing the connection/relationship  
% between class and subject
% class(name, subject)
% A predicate made up by a set of facts.

class(101, 'DM').
class(101, 'test').
class(101, 'SI').
class(101, 'LSD').
class(101, 'BI').

% The relation expressing the connection/relationship  
% between weekday and subject
% schedule(weekday(0-6), subject)
% A predicate made up by a set of facts.

schedule(0, 'test').
schedule(1, 'test').
schedule(1, 'BI').
schedule(2, 'SI').
schedule(2, 'LSD').
schedule(4, 'DM').
完成后,您可以询问以下问题:

例如:

学生(姓名、班级ID、学期)、班级(班级ID、班级名称)。

这意味着:

检索所有元组“SNAME,CLASS_ID,sement,CLASS_NAME”,您可以将
学生
关系的一个元素(或
学生
谓词的一个事实)和
关系的一个元素(或
谓词的一个事实)并列使值
CLASS_ID
以与所述值相同的方式出现在这两个值中。这显然是一个错误

然后,您可以通过使用一个子句定义一个新谓词来重新打包该查询,您感兴趣的值将出现在该子句中:

有趣(SNAME,班级名称):-学生(SNAME,班级ID,学期),班级(班级ID,班级名称)。

并将其添加到程序中

完成后,您可以对表单发出新的查询

有趣的(S,C)。

最后,你需要自己尝试一下。这是唯一的办法


当你写
学期主题(2,DM)时。
你是说
DM
是一个变量。如果你想让它成为一个原子,你必须写
学期\u科目(2,dm)。
% The student relation: student(name, class, semester)
% A predicate made up by a set of facts.

student('søren', 101, 1).
student('jens', 101, 1).
student('peter', 101, 2).
student('eskild', 101, 1).
student('jørgen', 101, 2).
student('signe', 101, 1).
student('pernille', 101, 2).
student('katrine', 101, 2).
student('sophie', 101, 1).
student('liva', 101, 1).

% The relation expressing the connection/relationship  
% between semester and subjects
% semester_subjects(semester, subject)
% A predicate made up by a set of facts.

semester_subjects(2, 'DM').
semester_subjects(1, 'test').
semester_subjects(2, 'BI').
semester_subjects(1, 'SI').
semester_subjects(1, 'LSD').
semester_subjects(2, 'SI').
semester_subjects(2, 'LSD').

% The relation expressing the connection/relationship  
% between class and subject
% class(name, subject)
% A predicate made up by a set of facts.

class(101, 'DM').
class(101, 'test').
class(101, 'SI').
class(101, 'LSD').
class(101, 'BI').

% The relation expressing the connection/relationship  
% between weekday and subject
% schedule(weekday(0-6), subject)
% A predicate made up by a set of facts.

schedule(0, 'test').
schedule(1, 'test').
schedule(1, 'BI').
schedule(2, 'SI').
schedule(2, 'LSD').
schedule(4, 'DM').