99 бутылок пива на Прологе

Следующий код и запрос не работают:

bottles(X) :-
    write(X), write(' bottles of beer on the wall,'), nl,
    write(X), write(' bottles of beer,'), nl,
    write('Take one down, and pass it around,'), nl,
    X1 is X - 1,
    write(X1), write(' bottles of beer on the wall.'), nl,
    bottles(X1).
bottles(1) :-
    write('1 bottle of beer on the wall, 1 bottle of beer,'), nl,
    write('Take one down, and pass it around,'), nl,
    write('Now they are alle gone.'), nl.

?- bottles(99).

С SWI-Prolog 8.3.15 в Windows я даже не могу нажать Ctrl-C.

Что происходит не так?


person Mostowski Collapse    schedule 22.12.2020    source источник
comment
Проблема с Ctrl-C может быть связана с swi-prolog.discourse.group/t /отладчик-прерывания/3339   -  person Mostowski Collapse    schedule 22.12.2020


Ответы (1)


Он всегда будет повторяться, поскольку первое правило никогда не говорит, что X должно быть больше единицы. Таким образом, вы исправляете это с помощью:

bottles(X) :-
    X > 1,  %% ← check that X is greater than one.
    write(X), write(' bottles of beer on the wall,'), nl,
    write(X), write(' bottles of beer,'), nl,
    write('Take one down, and pass it around,'), nl,
    X1 is X - 1,
    write(X1), write(' bottles of beer on the wall.'), nl,
    bottles(X1).
bottles(1) :-
    write('1 bottle of beer on the wall, 1 bottle of beer,'), nl,
    write('Take one down, and pass it around,'), nl,
    write('Now they are alle gone.'), nl.
person Willem Van Onsem    schedule 22.12.2020
comment
Это был тест. Кто-то из близких проголосовал за мой вопрос об устранении разрезов в Прологе. Так что я удалил его, прежде чем он был закрыт. Но 99 бутылок подходит для stackoverflow. Очень интересно... - person Mostowski Collapse; 22.12.2020
comment
@MostowskiCollapse: ну, я не имел к этому никакого отношения. Я думаю, что это соответствует теме. Единственная причина, о которой я могу думать, заключается в том, что люди могут рассматривать это больше как теорию логического программирования и, следовательно, могут принадлежать cstheory.stackexchange.com. - person Willem Van Onsem; 22.12.2020
comment
Не совсем. Это просто упражнение по программированию. Вместо того, чтобы программировать 99 бутылок, вы выполняете устранение вырезания кода, что является преобразованием доказательства. Пролог очень удобен для преобразования доказательств. Это не сокращение Пролога (!). - person Mostowski Collapse; 22.12.2020
comment
По сути, есть 99 сокращений, вы берете одно сокращение, получается 98 сокращений и т. Д. Шутка, но это даже не неправильно. - person Mostowski Collapse; 22.12.2020
comment
@MostowskiCollapse: почему вы удалили вопрос до того, как он действительно был закрыт? - person gusbro; 22.12.2020
comment
@gusbro Потому что обычно близкое голосование побуждает других также закрыть голосование. Так что рано или поздно вопрос будет закрыт, что сделает вопрос непригодным для использования. - person Mostowski Collapse; 22.12.2020