Пролог, бесконечный цикл - PullRequest
0 голосов
/ 17 мая 2018

Я выполнил следующий код, чтобы просмотреть все студенческие идентификаторы, начиная с 476 и заканчивая 520.

schedule_errors(A,B,C):-
    Errors is 0,
    check_Courses(476,A,B,C,Errors).

check_Courses(X,A,B,C,Errors):-
   . .
   . .
   . .
   Y is X+1,
   check_Courses(Y,A,B,C,Er).

Проблема в том, что программа продолжает работать неопределенно долго, игнорируя мой предикат цикла выхода

check_Courses(520,A,B,C,Er):-
    write('Check complete').

Я не могу понять, что я делаю неправильно.я попробовал аналогичную более легкую версию (только считая до 10), и она отлично работает

loop(10):-
    write('cd finished').

loop(X):-
    write(X), nl,
    Y is X+1,
    loop(Y).

Что мне не хватает?

1 Ответ

0 голосов
/ 17 мая 2018

Одним из важных замечаний является то, что loop/1 не также не завершается.Например, вы можете увидеть это следующим образом:

?- loop(1), <b>false</b>.
1
2
3
...
8
9
cd finished10
11
12
13
14
...
49
50
51
...
32394
32395
...

Обратите внимание, что текстовый порядок , в котором вы формулируете свои пункты в Прологе, имеет значение.

Если вы меняете двапункты loop/1, тогда вы не получите единственное решение, только бесконечный поток вывода:

?- loop(1).
...
42642
42643
...

Так, в check_courses/5, если вы ставите более конкретный случай после случая, который подразделяетсяэто, тогда сначала будет всегда пробоваться текстовое первое предложение.

Ставьте простые случаи перед более сложными!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...