2013-02-27 53 views
1

我试图写一个简单的翻译,在那里你输入数字号码的清单,并返回类似这样的字符串值:我的Prolog的“转换器”脚本返回一个空列表

翻译([1,2, 3],X)。 X = [一,二,三]。

我写的代码作品...除了它返回一个空的列表。这里是我的代码和跟踪:

means(1, one). 
means(2, two). 
means(3, three). 
means(4, four). 
means(5, five). 
means(6, six). 
means(7, seven). 
means(8, eight). 
means(9, nine). 
means(10, ten). 

translate([], X). 
translate([H|T], []):- 
    means(H, X), 
translate(T, X). 

translate([H|T], X):- 
    means(H, Y), 
    translate(T, [X|Y]). 


[trace] 1 ?- translate([1,2,3], X). 
    Call: (6) translate([1, 2, 3], _G2219) ? creep 
    Call: (7) means(1, _G2301) ? creep 
    Exit: (7) means(1, one) ? creep 
    Call: (7) translate([2, 3], one) ? creep 
    Call: (8) means(2, _G2301) ? creep 
    Exit: (8) means(2, two) ? creep 
    Call: (8) translate([3], [one|two]) ? creep 
    Call: (9) means(3, _G2304) ? creep 
    Exit: (9) means(3, three) ? creep 
    Call: (9) translate([], [[one|two]|three]) ? creep 
    Exit: (9) translate([], [[one|two]|three]) ? creep 
    Exit: (8) translate([3], [one|two]) ? creep 
    Exit: (7) translate([2, 3], one) ? creep 
    Exit: (6) translate([1, 2, 3], []) ? creep 
X = [] . 

我的另一个问题是:为什么我的列表作为串联[一个|二] |三]?而不是[一,二,三]?

感谢,

+0

彼得,你有任何改变想要删除这个问题吗?如果是这样,请出于定制原因举报主持人。我回滚了你的编辑,因为它可以被认为是针对你自己的帖子的破坏行为。 – bfavaretto 2013-02-28 03:29:17

回答

3

你得到,因为translate([H|T], [])条款空单。

整个程序(除了means事实)可以如此简单:

translate([], []). 

translate([NumH | NumT], [WordH | WordT]) :- 
    means(NumH, WordH), 
    translate(NumT, WordT). 
+0

工作就像一个魅力!非常感谢! – peter9464 2013-02-27 01:44:54

1

自己动手来做这些谢尔盖的方式是很好的做法,但你可以maplist/3进一步简化:

translate(Numbers, Words) :- maplist(means, Numbers, Words).