2011-11-01 98 views
2

我是一個初學者。如何將字母轉換爲*(星號)? 我知道它是序言中代表字符串的字符代碼。問題是如果它是一個字母,將它轉換爲「*」,如果它是一個下劃線,就保留它。序言中的hang子手

那麼如何知道它是否是下劃線呢?

回答

0

檢查字符串中的每個字符:

...maplist(convstar, String, Converted), ... 

convstar(0'_, 0'_). 
convstar(_, 0'*). 

另一種方法,使用 '如果 - 那麼' 結構:

convstar(X, Y) :- 
    ( X == 0'_ 
    -> Y = 0'_ 
    ; Y = 0'* 
). 
+0

您的第一種方法可能需要一次剪切,以防止在第一個成功的第二個子句中回溯成功。 – gusbro

1

所以,任務是用星號來代替字母。 起初,您應該在序言部分關於字符串google some material。不是很容易有類似的東西

string_replace([], []). 
string_replace([H | Tail], StringNew) :- 
    (not(underscore(H)), asterisk(A), StringNew = [A | StringTail], string_replace(Tail, StringTail)) 
    ; 
    (underscore(H), StringNew = [H | StringTail], string_replace(Tail, StringTail)) 
    . 

letter(X) :- 
    (X >= 97, X =< 122) 
    ; 
    (X >=65, X =<90). 

underscore(95). 
asterisk(42). 

main :- 
    string_replace("test_string", S1), 
    writef("%s", [S1]), nl, 
    string_replace("another string", S2), 
    writef("%s", [S2]), nl, 
    ! 
    . 

它的工作原理就像

?- main. 
****_****** 
************** 
true. 

它不使用任何內建謂詞,但它可能是有用的,以瞭解所有它確實有效。

+0

我認爲教好標準ISO的用法好得多,所以它是字符符號,以及爲常見任務(比如maplist)實現的習語。比較操作員是內置的。 – CapelliC

+0

我現在知道如何做到這一點,使用name() – leaflyfly