我试图在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).
答案 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)
,而是将X
和Y
之间的功能关系声明为: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章,以便更好地理解这些概念。