Prolog 根据事实递归地构建列表

Prolog 根据事实递归地构建列表,prolog,Prolog,在prolog中,我很难根据事实创建列表。我有一些“意思”的事实,一个字母映射到另一个字母,就像密码一样。我想写一个“解码器”,它获取编码消息字符的列表,并返回映射到的值的列表 means(a,z). means(z,a). means(b,y). means(y,b). means(c,x). means(x,c). means(d,w). means(w,d). means(e,v). means(v,e). means(f,u). means(u,f).

在prolog中,我很难根据事实创建列表。我有一些“意思”的事实,一个字母映射到另一个字母,就像密码一样。我想写一个“解码器”,它获取编码消息字符的列表,并返回映射到的值的列表

 means(a,z). 
 means(z,a).
 means(b,y). 
 means(y,b).
 means(c,x). 
 means(x,c).
 means(d,w). 
 means(w,d).
 means(e,v). 
 means(v,e).
 means(f,u). 
 means(u,f).
 means(g,t). 
 means(t,g).
 means(h,s). 
 means(s,h).
 means(i,r). 
 means(r,i).
 means(j,q). 
 means(q,j).
 means(k,p). 
 means(p,k).
 means(l,o). 
 means(o,l).
 means(m,n). 
 means(n,m).
以下是解码过程正确行为的一些示例:

 ?- decode([r,o,l,e,v,k,i,l,o,l,t],X).
 X = [i, l, o, v, e, p, r, o, l, o, g] ;
 No
 ?- decode(Y,[i,l,o,v,e,p,r,o,l,o,g]).
 Y = [r, o, l, e, v, k, i, l, o, l, t] ;
 No
这是我的“解码”版本,我对prolog是新手,我确信我错过了一些重要的东西。我知道你不能像在其他语言中那样修改列表 加上(X,L,[X | L])

我知道在“add”中,我将添加到列表的前面,而不是末尾,但我不知道如何在prolog中这样做。任何帮助都将不胜感激


谢谢

请正确设置程序格式,以免收到任何警告。您的程序实际上是什么还不清楚。不需要
add/3
decode(Xs,Ys):-maplist(意思是Xs,Ys)。
或者更详细地说:
decode([],[])。解码([X | Xs],[Y | Ys]):-表示(X,Y),解码(X,Ys)。
谢谢你的回答。真棒的名字顺便说一句。请正确格式化你的程序,这样你就不会得到任何警告。您的程序实际上是什么还不清楚。不需要
add/3
decode(Xs,Ys):-maplist(意思是Xs,Ys)。
或者更详细地说:
decode([],[])。解码([X | Xs],[Y | Ys]):-表示(X,Y),解码(X,Ys)。
谢谢你的回答。真棒的名字。
 decode([],L).

 decode([A|B],L) :-
  means(A,X),
  add(X,L,C),
  decode(B,C).