Prolog 谓词不';t工作“;“另一种方式”;

Prolog 谓词不';t工作“;“另一种方式”;,prolog,dcg,Prolog,Dcg,此函数获取一个字符串并使其成为海盗语言 :- dynamic (lang/2). lang([],[]). lang(Text, Text2) :- [Head|Tail] = Text, lang(Tail,X2), (member(Head,[101,97,105,111,117,121]) -> append([Head],X2,Text2) ; append([Head,111,Head],X2,Text2)

此函数获取一个字符串并使其成为海盗语言

  :- dynamic (lang/2).
  lang([],[]).
  lang(Text, Text2) :-
    [Head|Tail] = Text,
    lang(Tail,X2),
    (member(Head,[101,97,105,111,117,121])
        -> append([Head],X2,Text2)
        ; append([Head,111,Head],X2,Text2)
        ).
但当我想让它接受盗版语言并返回正常语言时,它就不起作用了

  :- dynamic (lang/2).
  lang([],[]).
  lang(Text, Text2) :-
    [Head|Tail] = Text,
    lang(Tail,X2),
    (member(Head,[101,97,105,111,117,121])
        -> append([Head],X2,Text2)
        ; append([Head,111,Head],X2,Text2)
        ).
它在调用lang([字符的十六进制代码列表],X)时工作。 但是它不适用于
lang(X,[上面的答案])
我让它工作了。
我将其分为两种情况,一种是处理输入为
([Head | Tail],[Head,111,Head])
时的情况,另一种是处理输入为
([Head | Tail],[Head | Rest])
时的情况。如果使用DCG,这是进行此类处理的正确工具,您可以得到两个方向:

lang([]) --> [].
lang([H|T]) --> [H], { member(H, [101, 97, 105, 111, 117, 121]) }, lang(T).
lang([H,111,H|T]) --> [H], { \+ member(H, [101, 97, 105, 111, 117, 121]) }, lang(T).

lang(Text, Arg) :- phrase(lang(Arg), Text).
查询结果:

| ?- lang("arg", L), atom_codes(A, L).

A = arorgog
L = [97,114,111,114,103,111,103] ? ;

no
| ?- lang(A, "arorgog"), atom_codes(L, A).

A = [97,114,103]
L = arg ? ;

no
| ?-

我将把它作为一个练习来整理它。:)

除非您计划动态地断言或收回形式为
lang/2
,否则您不需要
dynamic(lang/2)
。请注意,
append([Head],X2,Test2)
相当于,
[Head | X2]=Test2
append([Head,111,Head],X2,Test2)相当于,
[Head,111,Head | X2]=Test2
,因此,在这种情况下,您不需要
append/3
。很好的解决方案!通过将
双引号设置为
codes
,您可以将
[101,97105111117121]
写成:
“eaiouy”
,我发现它更具可读性。