【发布时间】:2023-03-15 00:50:01
【问题描述】:
该计划旨在检查学生是否参加了指定的课程列表。但即使学生已经参加了该课程列表,它也会显示为 false。我做错了什么?
代码:
%Structure Of facts
%student(ID,FirstName,LastName,Advisor,CreditsPassed,GPA,CourseTakenList).
%courses_taken(CourseId,CourseTitle, Credit,Grade, NoOfTimesRepeated).
%Fact
student(20135639,'Sara','Haider','Mr. Hussain Al-Arrayed',98,3.95,
[courses_taken('ITCE418', 'PRODUCTIVITY WITH IS TECHNOLOGY',3,'A', 0),
courses_taken('MATHS101', 'CALCULUS I', 3,'A', 0),
courses_taken('ACC112', 'FINANCIAL ACCOUNTING I', 3, 'A', 0),
courses_taken('ECON140', 'MICROECONOMICS', 3,'A', 0),
courses_taken('ENGL219', 'TECHNICAL REPORT WRITING', 3,'A', 0) ] ).
check_prereq([],Id):- !.
check_prereq([course(P)]|T,Id):-
student(Id,_,_,_,_,_, CoursesTakenList),
member( courses_taken(P,_,_,_,_), CoursesTakenList),
check_prereq(T,Id).
以下查询应该返回 true,因为学生已经学习了这些课程
?- check_prereq([course('ITCE418'), course('ACC112')],20135639).
false.
我是不是做错了什么?
【问题讨论】:
-
这是一个错误:
heck_prereq(course(P)|T,Id)。您是否打算将第一个参数作为列表?如果是这样,您需要括号:[course(P)|T]。没有括号,它只是术语,'|'(course(P), T)。在一些 Prologs 中,比如 GNU,这是一个语法错误。 -
@lurker 是的,我打算将第一个参数作为一个列表。感谢您指出语法错误。我已经纠正了它,但输出仍然是假而不是真。
-
@Far,你需要用
[course(P)|T]替换:[course(P)]|T -
@coder 是的,我就是这样做的。但输出没有区别。纠正语法错误后返回false的程序逻辑错了吗?
-
@Far,看来你没有...检查我的答案。