/* a^nb^nc^n problem in Picat. Generate (only) strings of the form a^nb^nc^n where n is a number. From Nilsson & Matuszynski: "Logic, Programming and Prolog" Page 191f (Chapter 10: Logic and Grammar) This model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import v3_utils. main => go. /* a^nb^nc^n [] abc aabbcc aaabbbccc aaaabbbbcccc aaaaabbbbbccccc aaaaaabbbbbbcccccc aaaaaaabbbbbbbccccccc aaaaaaaabbbbbbbbcccccccc aaaaaaaaabbbbbbbbbccccccccc aaaaaaaaaabbbbbbbbbbcccccccccc aaaaaaaaaaabbbbbbbbbbbccccccccccc aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccccc aaaaaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccc aaaaaaaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccc aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccc aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbccccccccccccccccc aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbcccccccccccccccccc aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbccccccccccccccccccc aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbcccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccc */ go ?=> println("a^nb^nc^n"), abc($S-[]), println(S), length(S,Len), (Len < 100 -> fail ; true), nl. go => true. /* a^nb^nc^n where n is an even number [] aabbcc aaaabbbbcccc aaaaaabbbbbbcccccc aaaaaaaabbbbbbbbcccccccc aaaaaaaaaabbbbbbbbbbcccccccccc aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc aaaaaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccc aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccc aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbcccccccccccccccccc aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbcccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccc */ go2 ?=> println("a^nb^nc^n where n is an even number"), abc2(S,[]), println(S), length(S,Len), (Len < 100 -> fail ; true), nl. go2 => true. % Example 10.7 (page 191) % using difference lists abc(X0-X3) :- a(N,$X0-X1), b(N,$X1-X2), c(N,$X2-X3). a(0,X0-X0). a(s(N),[a|X1]-X2) :- a(N,$X1-X2). b(0,X0-X0). b(s(N),[b|X1]-X2) :- b(N,$X1-X2). c(0,X0-X0). c(s(N),[c|X1]-X2) :- c(N,$X1-X2). % % DCG version: % a^nb^nc^n where n is an even number % % page 196 abc2 --> a2(N),b2(N),c2(N), {even2(N)}. a2(0) --> []. a2(s(N)) --> [a],a2(N). b2(0) --> []. b2(s(N)) --> [b],b2(N). c2(0) --> []. c2(s(N)) --> [c],c2(N). % Picat has a different version of even even2(0). even2(s(s(N))) :- even2(N).