PROLOG - 条件函数

时间:2018-03-02 00:04:26

标签: prolog

如何列出已注册男女学生的课程的名称

CODE:

/*student(name,studnumb,age,sex)*/ 
student(braum,1234,22,male).
student(lux,7839,26,female).
student(ekko,1726,29,male).
student(kayle,1114,25,female).
student(darius,6654,36,male).
student(morgana,4627,20,female).
student(ashe,2563,25,female).
student(brand,9258,30,male).

findboys(GENDER):-
   student(_, IS, SY, GENDER),
   (  var(GENDER)->true
   ;  SY = male
   ),
   takes(IS, IT),
   teaches(TN,IT),
   writeln([TN,course(IS, _)]),
   fail
;  true.

/*takes(studnum,modnum)*/  
takes(1234,1111).
takes(7839,1111).
takes(1726,1111).
takes(1114,2345).
takes(6654,1111).
takes(4627,4588).
takes(2563,2222).
takes(9258,6534).

/*course(modnum,modname)*/ 
course(2222,maths).
course(2345,english).
course(1111,computerscience).
course(6654,spanish).
course(6789,antrophormism).
course(4588,teology).

不幸的是,我可以实现正确的查询或条件来打印列表中名称的男女学生注册的课程对他们来说

1 个答案:

答案 0 :(得分:1)

使用Prolog,将其视为合乎逻辑的陈述:

  

C是一个包含男女学生的课程如果 has_male_students(C)和has_female_students(C)

您可以按如下方式编写,将:-运算符视为 if

has_both_mf(C) :- has_gender(C, male), has_gender(C, female).

现在你只需要计算具有特定性别的班级的逻辑:

  

C有性别G学生,如果 C的ID为CourseId,则学生ID为CourseId,学生ID为性别G

您可以将其写为:

has_gender(C, G) :-
    course(CourseId, C),
    takes(StudentId, CourseId),
    student(_, StudentId, _, G).

现在你将要重复,因为一个班级可能有多个男女学生,所以一个给定的班级以不止一种方式解决相同的逻辑。我将此作为练习来获得独特的解决方案。一种简单的方法是在SWI Prolog中使用once/1谓词(您可以在文档中找到它)。