Prolog 根据事实递归地构建列表
在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).
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).