Поиск значения в списке с помощью Prolog

#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, а не отдельным элементом? В этом есть большой смысл. Спасибо, это работает отлично 🙂