我一直在尝试使用此代码一段时间,它说有语法错误,但我不确定它是什么。
studies(ahmed,history(77,63)).
studies(john,chemistry(0,21)).
passed(Person,Subj):-
studies(Person, Subj(Work, Exam)),
Final is Work + Exam,
Final >=60.
答案 0 :(得分:1)
你不能直接“参数化”仿函数,但你可以使用=../2
运算符,它将一个仿函数和参数与一个列表统一起来:
passed(Person, Subj):-
studies(Person, SubjWorkExam),
SubjWorkExam =.. [Subj, Work, Exam],
Work + Exam >= 60.
这可以避免对谓词中的各种主题进行硬编码。此外,比较运算符>=/2
将评估表达式,因此不需要单独的is/2
。
答案 1 :(得分:0)
您不能将变量用作子句的名称,您可以改为编写:
passed(Person,Subj):-
(Subj=history-> studies(Person, history(Work, Exam))
;Subj=chemistry-> studies(Person, chemistry(Work, Exam)),
Final is Work + Exam,
Final >=60.