问题描述
在我的离散数学课程中,我们只有一个序言作业,如下所示:
创建一个模拟学生,班级,房间,日期和日期的程序 他们的关系。包括相关功能
我最初的想法是需要生成大量数据,并且我仍然很好奇是否可以在不显式映射每个关系的情况下完成此分配。
显然,似乎有两种策略可以使用图形(似乎复杂)或使用这种映射策略relation(value,value2)
(我想称谓为谓词,但是我不确定是否正确)
但是我似乎无法弄清楚如何在规则内访问关系? (我的意思是:-语法,对我来说,似乎比规则更像函数)
我觉得自己处于困境,因为我在使用术语方面遇到困难,因此在寻找解决该问题所需的信息时遇到了问题。
%student(name,class,semester)
student(søren,101,1).
student(jens,1).
student(peter,2).
student(eskild,1).
student(jørgen,2).
student(signe,1).
student(pernille,2).
student(katrine,2).
student(sophie,1).
student(liva,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,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
}
但是我无法确定如何做到这一点。总结我的问题。
我当前的方式应该如何工作,如何才能根据另一种关系(彼得苏珊)取值? 如果我目前的方法行不通,您将如何建议解决此任务
解决方法
这很难解释,需要至少2个小时的指导。
这是标准的数据库建模任务。
您拥有“对象”
- 学生具有属性 name , class ,学期
这是由Prolog中的谓词 student/3
建模的。在relational database terminology / the relational model中,这称为关系或表。
外观不同(假设它以表格形式出现),但是...是同一件事。
您拥有“被淘汰的物品”
- 学期,属性为 semester id ,值为1或2
- 主题,属性为主题名称,其值为
DM
,test
等。
未使用谓词明确列出(尽管可能,但根据应用情况建议使用),如下所示:
semester(1).
semester(2).
subject("DM").
subject("test").
相反,通过在对象之间建立2位关系来隐式列出这些对象
-
通过 semester_subjects 与 subject 相关的
- 学期
,这是通过谓词(又称为关系)semester_subjects/2
来建模的。
等
(请注意,您的代码是错误的。Prolog会将以大写字母开头的任何内容视为变量,因此您必须键入"DM"
或'DM'
而不是DM
。)
转到SWISH并输入您的数据。
% The student relation: student(name,class,semester)
% A predicate made up by a set of facts.
student('søren',101,1).
student('jens',1).
student('peter',2).
student('eskild',1).
student('jørgen',2).
student('signe',1).
student('pernille',2).
student('katrine',2).
student('sophie',1).
student('liva',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,'BI').
schedule(2,'SI').
schedule(2,'LSD').
schedule(4,'DM').
完成后,您可以提出查询:
例如:
student(SNAME,CLASS_ID,SEMESTER),class(CLASS_ID,CLASS_NAME).
这意味着:
检索所有元组“ SNAME,CLASS_ID,SEMESTER,CLASS_NAME”,您可以在其中并置student
关系的元素(或student
谓词的事实)和{的元素{1}}关系(或class
谓词的事实),使得值class
出现在两个相同的陈述中。这显然是database JOIN operation。
然后,您可以通过使用一个子句定义一个新的谓词来重新包装该查询,在该子句中您会看到感兴趣的值:
CLASS_ID
并将其添加到程序中。
完成后,您可以发出以下形式的新查询
interesting(SNAME,CLASS_NAME) :- student(SNAME,CLASS_NAME).
最后,您需要自己尝试一下。这是唯一的方法。