我需要從字符串中刪除一個字符。例如:從Prolog的字符串中刪除字符
?- remove_char('abcde', 'c', X).
X = 'abde'
?- remove_char('abcdefgh', 'f', X).
X = 'abcdegh'
我正在尋找一個簡潔的方式來完成此操作,但我沒有成功。我是Prolog的新手,如果我不想將它們轉換爲列表,我很難處理字符串。有沒有內置函數,或者至少是一個簡潔的方法?
我需要從字符串中刪除一個字符。例如:從Prolog的字符串中刪除字符
?- remove_char('abcde', 'c', X).
X = 'abde'
?- remove_char('abcdefgh', 'f', X).
X = 'abcdegh'
我正在尋找一個簡潔的方式來完成此操作,但我沒有成功。我是Prolog的新手,如果我不想將它們轉換爲列表,我很難處理字符串。有沒有內置函數,或者至少是一個簡潔的方法?
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。
你不是在處理你的代碼中的字符串:'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)
.
你的代碼看起來像巫術給我,但我很高興它的工作原理。儘管我知道atom_concat/3謂詞,但我並不真正理解它爲什麼會這樣做。謝謝您的回覆! – renatov