如何在序言中实现原子列表连接?
how to implement atomic list concatenate in prolog?
创建了这个谓词并且它确实有效但我被要求在不使用内置函数的情况下实现原子列表连接,这可能吗?
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)
).
如果您的价值域非常有限,只需使用 table 个事实!
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]).
请注意 atomic_list_concat/[2,3]
仅适用于 SWI-Prolog。
此外,对于您的任务,您不需要串联原子,您需要 list 个原子。
上面的代码在所有 Prolog 系统上运行,它是 bi-directional。
创建了这个谓词并且它确实有效但我被要求在不使用内置函数的情况下实现原子列表连接,这可能吗?
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)
).
如果您的价值域非常有限,只需使用 table 个事实!
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]).
请注意 atomic_list_concat/[2,3]
仅适用于 SWI-Prolog。
此外,对于您的任务,您不需要串联原子,您需要 list 个原子。
上面的代码在所有 Prolog 系统上运行,它是 bi-directional。