Prolog相互递归

时间:2014-06-19 08:45:10

标签: 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|Tail] = SP,
    sem1ok(Tail).

我还没有放任何代码来检查(有两个关系,因为它必须检查交替值),我遇到代码循环问题,直到它有一个空列表,然后它失败然后回来假(不)。由于这段代码没有操纵任何代码,我相信它现在应该回归真实。为什么不呢?

1 个答案:

答案 0 :(得分:2)

您需要一些空列表规则。加上这个:

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