【问题标题】:What am I doing wrong in the below Prolog code我在下面的 Prolog 代码中做错了什么
【发布时间】: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,看来你没有...检查我的答案。

标签: recursion prolog


【解决方案1】:

你需要替换:[course(P)]|T with [course(P)|T]

 check_prereq([],_):- !.
 check_prereq([course(P)|T],Id):-
     student(Id,_,_,_,_,_, CoursesTakenList),
     member( courses_taken(P,_,_,_,_), CoursesTakenList),
     check_prereq(T,Id). 

还在第一行将Id 替换为_(匿名变量)以消除警告(单例变量)。现在它工作正常:

?- check_prereq([course('ITCE418'), course('ACC112')],20135639).
true ;
false.

请注意,它返回 true,请求更多解决方案返回 false,但它如我们预期的那样成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多