好的我正在编写一些代码来通过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).
我还没有放任何代码来检查(有两个关系,因为它必须检查交替值),我遇到代码循环问题,直到它有一个空列表,然后它失败然后回来假(不)。由于这段代码没有操纵任何代码,我相信它现在应该回归真实。为什么不呢?
答案 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).