99 Bottles of Beer/Prolog: Difference between revisions
Content added Content deleted
(moving code from main task-page to sub-page / Visual Prolog) |
|||
Line 12: | Line 12: | ||
=={{header|Prolog}}== |
=={{header|Prolog}}== |
||
{{works with|SWI Prolog}} |
{{works with|SWI Prolog}} |
||
<lang prolog>bottles(0) |
<lang prolog>bottles(0). |
||
bottles(X):- |
bottles(X):- |
||
writef('%t bottles of beer on the wall \n',[X]), |
writef('%t bottles of beer on the wall \n',[X]), |
||
Line 23: | Line 23: | ||
:- bottles(99).</lang> |
:- bottles(99).</lang> |
||
It is possible to extend the previous version so to handle singular and plurals of the word 'bottle': |
|||
⚫ | |||
<lang prolog>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).</lang> |
|||
⚫ | |||
<lang prolog>line1(X):- line2(X),write(' on the wall'). |
<lang prolog>line1(X):- line2(X),write(' on the wall'). |
Revision as of 17:52, 27 December 2020
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
<lang 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).</lang>
It is possible to extend the previous version so to handle singular and plurals of the word 'bottle':
<lang prolog>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).</lang>
Another version that handles plural/not plural conditions.
<lang prolog>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).</lang>
Visual Prolog
<lang 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).
</lang>