2014-11-03 79 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會讓事情變得更加難以處理。

請考慮使用this answer中描述的Prolog標誌double_quotes,因爲它允許您使用雙引號。然後,你可以寫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留下Prolog的純單調部分。


編輯:看來你還是不滿意我所描述的。所以這裏是text_maxl33t/2

text_maxl33t(W, L33t) :- 
    text_xl33t(W, L33t), 
    \+ text_l33t(L33t, _). 

請注意,這個謂詞仍然是一個關係。也就是說,對於一個單詞你可能有幾個獨立的maxl33ts,因爲重寫不一定合流。

+0

謝謝!如果一個字你必須做2個或更多的替換,那麼呢? (例如,如果單詞是「foryeahfor」) – chnging 2014-11-03 01:09:22

+0

嗨,編輯更多的替換不起作用。它返回與輸入相同的列表。 – chnging 2014-11-03 13:28:25

+0

@ chnging:見上。 – false 2014-11-03 14:08:54