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

Я пишу рекурсивную функцию в Прологе, чтобы проверить, соответствует ли курс (Crs) в семестре (SEM, список) обязательному курсу в Prior (список). Во втором блоке кода есть 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,[]).

person Aaron Troeger    schedule 20.06.2014    source источник


Ответы (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.

person Tudor Berariu    schedule 20.06.2014
comment
Да вы правы, Prior это список курсов. Понятно, я проверял, был ли список членом Prior, а не отдельным элементом? В этом есть большой смысл. Спасибо, отлично работает :) - person Aaron Troeger; 20.06.2014