谓词“不相反”

时间:2015-09-29 09:13:49

标签: 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)
        ).

调用lang([list of hex codes for chars], X).时有效 但它不适用于lang(X, [answer from above])

2 个答案:

答案 0 :(得分:2)

如果你使用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
| ?-

我会把它留作练习来整理它。 :)

答案 1 :(得分:0)

我得到了它的工作。 我将其拆分为两种情况,一种是在输入为([Head|Tail],[Head,111,Head])时处理该情况,另一种是在输入为([Head|Tail],[Head|Rest])时处理该情况。