I'm working on modernizing Rosetta Code's infrastructure. Starting with communications. Please accept this time-limited open invite to RC's Slack.. --Michael Mol (talk) 20:59, 30 May 2020 (UTC)

# 99 Bottles of Beer/Prolog

99 Bottles of Beer/Prolog is part of 99 Bottles of Beer. You may find other members of 99 Bottles of Beer at Category:99 Bottles of Beer.
99 Bottles of Beer done in Prolog-languages

## Prolog

Works with: SWI Prolog
`bottles(0).bottles(X):-    writef('%t bottles of beer on the wall \n',[X]),    writef('%t bottles of beer\n',[X]),    write('Take one down, pass it around\n'),    succ(XN,X),    writef('%t bottles of beer on the wall \n\n',[XN]),    bottles(XN). :- bottles(99).`

It is possible to extend the previous version so to handle singular and plurals of the word 'bottle':

`bottles(0):- write('no more bottles of beer').bottles(B) :-    dif(B,0), NewB is B - 1,    (        dif(B,1), writef('%t bottles of beer on the wall \n',[B]), writef('%t bottles of beer\n',[B]);        writef('%t bottle of beer on the wall \n',[B]), writef('%t bottle of beer\n',[B])    ),    write('Take one down, pass it around\n'),    (        NewB > 1, writef('%t bottles of beer on the wall \n\n',[NewB]);        NewB =:= 1, writef('%t bottle of beer on the wall \n\n',[NewB]);         true    ),     bottles(NewB). :- bottles(99).`

Another version that handles plural/not plural conditions.

`line1(X):- line2(X),write(' on the wall'). line2(0):- write('no more bottles of beer').line2(1):- write('1 bottle of beer').line2(X):- writef('%t bottles of beer',[X]).line3(1):- write('Take it down, pass it around').line3(X):- write('Take one down, pass it around').line4(X):- line1(X). bottles(0):-!.bottles(X):-	    succ(XN,X),    line1(X),nl,    line2(X),nl,    line3(X),nl,    line4(XN),nl,nl,    !,    bottles(XN). :- bottles(99).`

## Visual Prolog

` implement main    open core, std, console class predicates    bottles : (integer) -> string procedure (i). clauses    bottles(1) = "bottle" :- !.    bottles(_) = "bottles".     run():-        init(),        foreach B = downTo(99,1) do            write(B," ",bottles(B), " of beer on the wall,\n"),            write(B," ",bottles(B), " of beer,\n"),            write("Take one down, pass it around,\n"),            write(B-1," ",bottles(B-1)," of beer on the wall.\n\n")        end foreach,         succeed(). end implement main goal    mainExe::run(main::run). `