2014-11-03 5 views
0

Допустим, у меня есть эти правила:Пролог: как проверить, если это слово содержится в списке

rule([a,t,e],[8]). 
rule([f,o,r],[4]). 

Я должен проверить, если в слове (например [f,o,r,t,r,e,s,s]) Существует слово, которое находится в список правил и если нужно удалить это слово и заменить его номером, который он представляет. (поэтому он становится [4,t,r,e,s,s]).

Любые идеи?

ответ

1

Предполагая, что вы хотите один замену:

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, так как переписывание не обязательно сливается.

+0

Спасибо! А что, если одним словом, вы должны сделать 2 или более замен. (Например, если слово «foryeahfor») – chnging

+0

Привет, редактирование для большей замены не работает. Он возвращает тот же список, который вводится. – chnging

+0

@chnging: См. Выше. – false

Смежные вопросы