#list #recursion #prolog #member
#Список #рекурсия #пролог #Участник
Вопрос:
Я пишу рекурсивную функцию в Prolog, чтобы проверить, соответствует ли обязательный курс (Crs) в семестре (SEM, список) в Предыдущем курсе (список). конечно, во втором блоке кода есть 2 примера. Но когда он запускается, он терпит неудачу для csse1001 (который не имеет предварительного условия), когда он должен возвращать true, поскольку ему ничего не нужно искать. Что я упускаю из виду?
checkSem(Prior,[]).
checkSem(Prior,SEM):-
[Crs|Tail] = SEM,
member(pre(Crs,List),Prior),
checkSem(Prior,Tail).
Курс:
partA(comp3506).
lvl3(comp3506).
s1(comp3506).
pre(comp3506,[csse2002]).
partA(csse1001).
lvl1(csse1001).
s1(csse1001).
pre(csse1001,[]).
Ответ №1:
Вы не привели пример запроса checkSem/2
, но я предполагаю, что его первым аргументом Prior
является список курсов. Тогда, я думаю, вам следует проверить, является ли название курса членом, Prior
а не pre(Crs, List)
нет. Во-вторых, поскольку у вас есть список предварительных условий, а не только один, вы должны проверить, что все они являются членами в Prior .
checkSem(_,[]).
checkSem(Prior,[Crs|Tail]):-
pre(Crs, List),
(member(Prereq, List), member(Prereq, Prior)),
checkSem(Prior,Tail).
Эта цель (member(Prereq, List), member(Prereq, Prior))
выполняется, если не существует курса Prereq
, который является членом List
, и он не является членом Prior
.
Комментарии:
1. Да, вы правы, это список курсов. О, понятно, я проверял, был ли список членом Prior, а не отдельным элементом? В этом есть большой смысл. Спасибо, это работает отлично 🙂