Пролог Взаимная рекурсия

Хорошо, я пишу код для проверки каждого значения с помощью взаимной рекурсии в Прологе. Это мой код до сих пор:

semestersok(SP) :-
    [Prior|Tail] = SP,
    sem1ok(SP).



%% sem1ok(SP) :- checks semester 1 of SP is ok
sem1ok(SP) :-
    [Sem1|Tail] = SP,
    sem2ok(Tail).

%% sem2ok(SP) :-
sem2ok(SP) :-
    [Sem2|Tail] = SP,
    sem1ok(Tail).

Я еще не вставил ни одного кода, чтобы проверить (есть два отношения, так как он должен проверять чередующиеся значения), у меня проблема с циклическим циклом кода, пока у него не будет пустой список, затем он завершается неудачно и возвращается с ложным (нет). Поскольку этот код не манипулирует каким-либо кодом, я верю, что он должен вернуться в прежнее состояние. Почему не так?

1 ответ

Решение

Вам нужны некоторые правила для пустого списка. Добавь это:

sem1ok([]).
sem2ok([]).

Кроме того, код может быть более интуитивно понятным, если вы напишите его следующим образом (поскольку различие между правилом, соответствующим пустому списку, и правилом, соответствующим непустому списку, является более четким):

% Rules for sem1ok/1
sem1ok([]).
sem1ok([Sem1|Tail]):-
    ok(Sem1), % Something involving Sem1
    sem2ok(Tail).

% Rules for sem2ok/1
sem2ok([]).
sem2ok([Sem2|Tail]):-
    ok(Sem2), % Something involving Sem2
    sem1ok(Tail).
Другие вопросы по тегам