Пролог Взаимная рекурсия
Хорошо, я пишу код для проверки каждого значения с помощью взаимной рекурсии в Прологе. Это мой код до сих пор:
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).