【问题标题】:Prolog: converting atom to new atomProlog:将原子转换为新原子
【发布时间】:2011-05-14 13:58:16
【问题描述】:

我有一个谓词问题,它以原子列表的方式工作:

nopolfont([to,jest,tekśćik,'!'],L).

结果

L = [to,jest,tekscik,'!'].

我对 ma​​ke_swapswap 谓词有疑问。到目前为止,我有:

k(ś,s).
k(ą,a).
% etc.
swap(X,W) :- name(X,P), k(P,Y), !, name(Y,W).
swap(X,X).

make_swap(A,W)
  :- atom(A),!,
     name(A,L),
     swap(L,NL),
     name(W,NL).

nopolfont([],[]).
nopolfont([H|T],[NH|S]) :- make_swap(H,NH), nopolfont(T,S).

有什么优雅的方法可以做到这一点?

【问题讨论】:

    标签: prolog


    【解决方案1】:

    这也很优雅:

    polish_char_replacer(X, Y) :-
        k(X, Y),
        !.
    polish_char_replacer(X, X).
    
    nopolfont(Atoms1, Atoms2) :-
        maplist(replace(polish_char_replacer), Atoms1, Atoms2).
    
    replace(Goal, Atom1, Atom2) :-
        atom_chars(Atom1, Chars1),
        maplist(Goal, Chars1, Chars2),
        atom_chars(Atom2, Chars2).
    

    【讨论】:

      【解决方案2】:

      尽可能优雅:

      k(ś,s).
      k(ą,a).
      
      swap(X,W) :- name(P,[X]), k(P,Y), !, name(Y,[W]).
      swap(X,X).
      
      list_swap([], []).
      list_swap([H|T], [W|S]) :-
          swap(H, W),
          list_swap(T, S).
      
      atom_swap(A,W) :-
          atom(A), !,
          name(A, L),
          list_swap(L,S),
          name(W, S).
      
      nopolfont([],[]).
      nopolfont([H|T],[NH|S]) :-
          atom_swap(H,NH),
          nopolfont(T,S).
      

      另外,显然定义这个,以获得预期的结果,但我假设这是在% etc

      k(ć, c).
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多