2014-06-19 2 views
1

나는 프롤로그에서 상호 재귀에 의해 각 값을 확인하는 코드를 작성하고 있습니다. 이 지금까지 내 코드는 다음과 같습니다프롤로그 상호 재귀

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)로 돌아옵니다. 이 코드는 어떤 코드도 조작하지 않으므로 지금 당장 그대로서야합니다. 왜 안 그래?

답변

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

좋아, 바보 같이 들리겠다고 미안하지만 어디에 추가할까요? 이 코드가 나오기 전에? –

+1

술어에 대해 몇 가지 규칙을 쓸 수 있으며 일반적으로 모든 규칙은 함께 묶입니다. 그래서,'sem1ok/1'과'sem2ok/1'에 대한 규칙을 따로 따로 그룹화하십시오. –

+0

굉장해 고마워. 지금은 작동 중이다. 지금은 이상한 행동을 한 후에 행동을 요구하고있다. 그러나 실제로 돌아온다. –