2011-11-01 7 views
2

저는 초보자입니다. 문자를 * (별표)로 변환하려면 어떻게해야합니까? 문자열을 나타내는 프롤로그의 문자 코드라는 것을 알고 있습니다. 문제는 편지 인 경우 "*"로 변환하고, 밑줄이면 그대로 사용하십시오.교수형 집행 인

그래서 밑줄인지 아닌지 어떻게 알 수 있습니까?

답변

0

체크 문자열의 각 문자 :

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

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

또 다른 방법은,에 'IF-다음'구조를 사용하여이 :

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

첫 번째 방법은 이미 첫 번째 절에서 성공했을 때 두 번째 절에서 후행 추적이 성공하지 못하도록 차단해야 할 수도 있습니다. – gusbro

1

그래서 작업은 별표로 문자를 대체하는 것입니다. 처음에는 프롤로그의 문자열에 대해 some material을 사용해야합니다. 그것은 그것은 모든 내장 명령 술어를 사용하지 않는

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

처럼 작동하는

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, 
    ! 
    . 

처럼 뭔가를 쉽게,하지만 정말 어떻게 작동하는지 모두 이해하는 데 유용 할 수있어보다.

+0

나는 이것이 표준 ISO 사용법을 훨씬 더 잘 가르치는 것이라고 생각한다. 그래서 그것은 문자 표기법이고, 숙제는 일반적인 작업 (예를 들어, maplist처럼)을 위해 구현된다. 비교 연산자는 내장되어 있습니다. – CapelliC

+0

지금이 작업을 수행하는 방법을 알고 있습니다. name()을 사용하십시오. – leaflyfly

관련 문제