将列表翻译成prolog中的另一个列表

时间:2015-06-13 12:19:42

标签: prolog

我试图在Prolog中编写一个简单的代码,将列表转换为另一个列表。例如,如果我们致电listtrans([a,b,c],L)L将成为[1,2,3]。 (a,b,c用1,2,3代替)。但我在最后一行遇到语法错误。问题是什么?这是我的代码:

trans(a,1).
trans(b,2).
trans(c,3).

listtrans([],L).
listtrans([H|T],L1):-
   trans(H,B),
   append(B,L,L2),
   listtrans(T,L2).

2 个答案:

答案 0 :(得分:2)

没有句法错误,只有语义错误。就是这样,有更正:

listtrans([],[]).
listtrans([H|T],L1):-
   trans(H,B),
   append([B],L2,L1),
   listtrans(T,L2).

但这不是Prolog风格。一个人写道:

listtrans([],[]).
listtrans([A|As],[I|Is]):-
   trans(A,I),
   listtrans(As,Is).

请注意,在Prolog中,显式附加元素比支持函数的语言要少得多。作为额外奖励,您现在可以在两个方向上使用该关系:

?- listtrans([a,b,c],Is).
Is = [1,2,3].

?- listtrans(As, [1,2,3]).
As = [a,b,c].

你可以更紧凑地写出来:

listtrans(As, Is) :-
   maplist(trans, As, Is).

有关详情,请参阅this

答案 1 :(得分:1)

错误很可能是因为在您的代码中:

listtrans([H|T],L1):-
   trans(H,B),
   append(B,L,L2),
   listtrans(T,L2).

变量L1在头部声明,但未在任何地方引用:你拼错了什么?

无论如何,你的代码不起作用。

此外,使用append/3进行这种易于通过递归定义的任务被认为是可怕的(也是因为你从中获得了糟糕的表现)。

将函数应用于列表非常简单。您已经知道,在prolog中,您不会编写Y = f(X),而是将XY之间的功能关系声明为:f(X, Y).。 (这基本上就是你对trans(X,Y))的所作所为。

现在(简单)递归式:

  • 转换后的空列表是空列表
  • 如果[X|Xs] [Y|Ys]的转化为trans(X,Y),我们将Xs递归转换为Ys

或在prolog中表达:

listtrans([],[]).
listtrans([X|Xs],[Y|Ys]) :- trans(X,Y), listtrans(Xs,Ys).

我建议您阅读Learn Prolog Now的前4章,以便更好地理解这些概念。