Recursion Prolog相互递归

Recursion Prolog相互递归,recursion,prolog,mutual-recursion,Recursion,Prolog,Mutual Recursion,好的,我正在编写一些代码,在Prolog中通过相互递归检查每个值。 这是我目前的代码: 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|Ta

好的,我正在编写一些代码,在Prolog中通过相互递归检查每个值。 这是我目前的代码:

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).

我还没有放入任何代码来进行检查(有两个关系,因为它必须检查交替值),我遇到了代码循环的问题,直到它有一个空列表,然后它失败并返回false(no)。因为这段代码没有操纵任何代码,所以我相信它现在应该是真的。为什么不是呢

空列表需要一些规则。添加以下内容:

sem1ok([]).
sem2ok([]).
此外,如果您这样编写代码,代码可能会更直观(因为匹配空列表的规则与匹配非空列表的规则之间的区别更为明显):


好吧,很抱歉听起来很傻,但我该怎么补充呢?在所有这些代码之前,您可以为谓词编写任意数量的规则,并且通常所有规则都打包在一起。因此,将
sem1ok/1
sem2ok/1
的规则分别分组。太棒了,谢谢你,它现在可以工作了:)它只是在现在执行后请求一个动作,这很奇怪,但它回来了。不,等等,我找到了它为什么这样做。很好,非常感谢!
% 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).