2013-11-01 82 views
1

我需要從字符串中刪除一個字符。例如:從Prolog的字符串中刪除字符

?- remove_char('abcde', 'c', X). 
X = 'abde' 

?- remove_char('abcdefgh', 'f', X). 
X = 'abcdegh' 

我正在尋找一個簡潔的方式來完成此操作,但我沒有成功。我是Prolog的新手,如果我不想將它們轉換爲列表,我很難處理字符串。有沒有內置函數,或者至少是一個簡潔的方法?

回答

2

sub_atom/5可以幫助,無論如何這裏是一個替代方案。

remove_char(S,C,X) :- atom_concat(L,R,S), atom_concat(C,W,R), atom_concat(L,W,X). 

由於atom_concat被很好地落實,remove_char它更普遍比其名稱所暗示的:

2 ?- remove_char(abcabcd,bc,X). 
X = aabcd ; 
X = abcad ; 
false. 

一個很好的鍛鍊是嘗試實現相同的邏輯(「碎片」提取)與sub_atom/5。

+0

你的代碼看起來像巫術給我,但我很高興它的工作原理。儘管我知道atom_concat/3謂詞,但我並不真正理解它爲什麼會這樣做。謝謝您的回覆! – renatov

1

你不是在處理你的代碼中的字符串:'abcde'是一個原子。 "abcde"是一個prolog字符串(又名字符列表)。然而,這似乎很簡潔給我,如果你想與原子發揮:

remove_chars(X , C , Y) :- 
    atom_chars(X , Xs) , 
    strip(Xs , C , Ys) , 
    atom_chars(Y , Ys) 
    . 

strip([]  , _ , [] ) . 
strip([Y|Cs] , C , [Y|Ys]) :- Y \= C , strip(Cs,C,Ys) . 
strip([Y|Cs] , C , Ys ) :- Y = C , strip(Cs,C,Ys) . 

或者,使用內置的select/3,更簡潔:

remove_chars(X , C , Y) :- 
    atom_chars(X , Xs) , 
    select(C, Xs , Ys) , 
    atom_chars(Y , Ys) 
    . 
+0

strip/3似乎沒用,爲什麼不選擇/ 3? – CapelliC

+0

如果你正在嘗試學習序言,那麼自己動手幫助理解。補充說,作爲替代。 –

+0

我不知道它被稱爲「原子」。感謝您指出了這一點! – renatov