Предполагая, что вы хотите один замену:
text_l33t(W, L33t) :-
rule(A, B),
phrase((seq(Pre), seq(A), seq(Post)), W),
phrase((seq(Pre), seq(B), seq(Post)), L33t).
seq([]) -->
[].
seq([E|Es]) -->
[E],
seq(Es).
В качестве альтернативы, можно выразить, что отношения с append/3
, но даже с минимально более сложными примерами, append/3
будет делать вещи гораздо труднее справиться.
Рассмотрите также использовать флаг Prolog double_quotes
, как описано в this answer, поскольку он позволяет использовать двойные кавычки. Затем можно написать rule("to","2"). rule("ight","ite").
и получить обратно хорошие замены ответа, например, так:
?- text_l33t("right", L).
L = "rite".
Если вы хотите, возможно, более одной замены, все становится немного сложнее определить. Как насчет перекрытия разных переписываний? Как насчет перезаписи, которые становятся длиннее и длиннее? Следующее определение включает в себя все возможные переписывают:
text_xl33t(W, W).
text_xl33t(W, L33t) :-
text_l33t(W, L0),
text_xl33t(L0, L33t).
То, что вы, вероятно, хотите является максимальным переписывает. Хотя вы можете записать это в Prolog, я бы не стал делать это как новичок: вы оставляете для этого чистую монотонную часть Prolog.
Редактировать: Вам кажется, что вас все еще не устраивает то, что я описал. Так вот text_maxl33t/2
:
text_maxl33t(W, L33t) :-
text_xl33t(W, L33t),
\+ text_l33t(L33t, _).
Обратите внимание, что этот предикат все еще является отношением. То есть, для одного слова у вас может быть несколько независимых maxl33ts, так как переписывание не обязательно сливается.
Спасибо! А что, если одним словом, вы должны сделать 2 или более замен. (Например, если слово «foryeahfor») – chnging
Привет, редактирование для большей замены не работает. Он возвращает тот же список, который вводится. – chnging
@chnging: См. Выше. – false