1

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

私はチェックに関係するコードをまだ入れていません (交互の値をチェックする必要があるため、2 つの関係があります)。空のリストになるまでコードが循環し、失敗して戻ってくるという問題があります。 false (いいえ)。このコードはコードを操作していないので、現状のままで元に戻るはずです。なぜそうではないのですか?

4

1 に答える 1

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).
于 2014-06-19T08:46:59.650 に答える