Search code examples
prolog

how to implement atomic list concatenate in prolog?


Made this predicate and it actually works but I am asked to implement atomic list concat without using built in function, is that possible ?

gradeInWords(Num,Words) :-
   WordsList = [zero,one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,'one hundred'],
   (  Num < 20,
      nth0(Num,WordsList,Words),
      !
   ;  (  Tens is floor(Num/10),
         Ones is Num mod 10,
         (  Ones =:= 0,
            OnesWord = '',
            !
         ;  nth0(Ones,WordsList,OnesWord2),
            atomic_list_concat([",",OnesWord2],OnesWord)
         ),
         TPosition is Tens+19,
         nth1(TPosition,WordsList,TensWord)
      ),
      atomic_list_concat([TensWord,OnesWord],Words)
   ).

Solution

  • If your value domain is quite limited, simply use a table of facts!

    gradeInWords(0,[zero]).
    gradeInWords(1,[one]).
    gradeInWords(2,[two]).
    gradeInWords(3,[three]).
    gradeInWords(4,[four]).
    gradeInWords(5,[five]).
    gradeInWords(6,[six]).
    gradeInWords(7,[seven]).
    gradeInWords(8,[eight]).
    gradeInWords(9,[nine]).
    gradeInWords(10,[ten]).
    gradeInWords(11,[eleven]).
    gradeInWords(12,[twelve]).
    gradeInWords(13,[thirteen]).
    gradeInWords(14,[fourteen]).
    gradeInWords(15,[fifteen]).
    gradeInWords(16,[sixteen]).
    gradeInWords(17,[seventeen]).
    gradeInWords(18,[eighteen]).
    gradeInWords(19,[nineteen]).
    gradeInWords(20,[twenty]).
    gradeInWords(21,[twenty,one]).
    gradeInWords(22,[twenty,two]).
    gradeInWords(23,[twenty,three]).
    gradeInWords(24,[twenty,four]).
    gradeInWords(25,[twenty,five]).
    gradeInWords(26,[twenty,six]).
    gradeInWords(27,[twenty,seven]).
    gradeInWords(28,[twenty,eight]).
    gradeInWords(29,[twenty,nine]).
    gradeInWords(30,[thirty]).
    gradeInWords(31,[thirty,one]).
    gradeInWords(32,[thirty,two]).
    gradeInWords(33,[thirty,three]).
    gradeInWords(34,[thirty,four]).
    gradeInWords(35,[thirty,five]).
    gradeInWords(36,[thirty,six]).
    gradeInWords(37,[thirty,seven]).
    gradeInWords(38,[thirty,eight]).
    gradeInWords(39,[thirty,nine]).
    gradeInWords(40,[forty]).
    gradeInWords(41,[forty,one]).
    gradeInWords(42,[forty,two]).
    gradeInWords(43,[forty,three]).
    gradeInWords(44,[forty,four]).
    gradeInWords(45,[forty,five]).
    gradeInWords(46,[forty,six]).
    gradeInWords(47,[forty,seven]).
    gradeInWords(48,[forty,eight]).
    gradeInWords(49,[forty,nine]).
    gradeInWords(50,[fifty]).
    gradeInWords(51,[fifty,one]).
    gradeInWords(52,[fifty,two]).
    gradeInWords(53,[fifty,three]).
    gradeInWords(54,[fifty,four]).
    gradeInWords(55,[fifty,five]).
    gradeInWords(56,[fifty,six]).
    gradeInWords(57,[fifty,seven]).
    gradeInWords(58,[fifty,eight]).
    gradeInWords(59,[fifty,nine]).
    gradeInWords(60,[sixty]).
    gradeInWords(61,[sixty,one]).
    gradeInWords(62,[sixty,two]).
    gradeInWords(63,[sixty,three]).
    gradeInWords(64,[sixty,four]).
    gradeInWords(65,[sixty,five]).
    gradeInWords(66,[sixty,six]).
    gradeInWords(67,[sixty,seven]).
    gradeInWords(68,[sixty,eight]).
    gradeInWords(69,[sixty,nine]).
    gradeInWords(70,[seventy]).
    gradeInWords(71,[seventy,one]).
    gradeInWords(72,[seventy,two]).
    gradeInWords(73,[seventy,three]).
    gradeInWords(74,[seventy,four]).
    gradeInWords(75,[seventy,five]).
    gradeInWords(76,[seventy,six]).
    gradeInWords(77,[seventy,seven]).
    gradeInWords(78,[seventy,eight]).
    gradeInWords(79,[seventy,nine]).
    gradeInWords(80,[eighty]).
    gradeInWords(81,[eighty,one]).
    gradeInWords(82,[eighty,two]).
    gradeInWords(83,[eighty,three]).
    gradeInWords(84,[eighty,four]).
    gradeInWords(85,[eighty,five]).
    gradeInWords(86,[eighty,six]).
    gradeInWords(87,[eighty,seven]).
    gradeInWords(88,[eighty,eight]).
    gradeInWords(89,[eighty,nine]).
    gradeInWords(90,[ninety]).
    gradeInWords(91,[ninety,one]).
    gradeInWords(92,[ninety,two]).
    gradeInWords(93,[ninety,three]).
    gradeInWords(94,[ninety,four]).
    gradeInWords(95,[ninety,five]).
    gradeInWords(96,[ninety,six]).
    gradeInWords(97,[ninety,seven]).
    gradeInWords(98,[ninety,eight]).
    gradeInWords(99,[ninety,nine]).
    gradeInWords(100,[hundred]).
    

    Note that atomic_list_concat/[2,3] only works with SWI-Prolog.

    Also, for your task you don't need concatenated atoms, you want lists of atoms.

    The code above runs with all Prolog systems, and it is bi-directional.