我的Prolog"翻译"脚本返回一个空列表

时间:2013-02-27 01:12:17

标签: list prolog

我正在尝试编写一个简单的翻译器,您可以在其中输入数字列表,并返回其字符串值,如下所示:

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

我编写的代码有效...除了它返回一个空列表。这是我的代码和跟踪:

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 = [] .

我的另一个问题是:为什么我的列表连接为[[one | two] | three]?而不是[一,二,三]?

谢谢,

2 个答案:

答案 0 :(得分:3)

由于translate([H|T], [])子句,您获得了空列表。

整个程序(means个事实除外)可以这么简单:

translate([], []).

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

答案 1 :(得分:1)

手动完成谢尔盖的做法很好,但您可以使用maplist/3进一步简化:

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