2014-03-28 4 views

답변

0

내가 SICStus 프롤로그를 가지고 있지 않지만,이 (lib(iso_light)를로드 한 후) SWI - 프롤로그 6.2.6, B-프롤로그 8.1 이클립스 CLP 프롤로그에서 작동 :

V = 7, number_chars(V, N), atom_chars('S', A), append(A, N, X), atom_chars(NW, X). 

그것은에서와 같이 작동 할 수 SICStus 또는 매우 작은 수정이 필요할 수 있습니다.

atom_concat/3을 시도 할 수도 있지만 일부 Prolog 시스템은 숫자를 자동으로 원자로 변환 할 수 있지만 다른 것은 자동으로 변환하지 못합니다.

이 SWI - 프롤로그에서 작동하지만 B-프롤로그 또는 일식 CLP에서 :

V = 7, atom_concat('S', V, NW). 
1

귀하의 예는 문자열보다는 원자를 사용합니다. 원자는 인용 부호가없는 베어 브릭 또는 인용 된 단어이며 아포스트로피 (')로 구분됩니다. 예 :

  • foo은 원자입니다.
  • 'This is a quoted atom' 또한 원자

다른 유형의 정수 (1234) 및 빈리스트 [] 포함 원자이다. 원자의 정의 특징은 원자 (나눌 수 없다)이다.

프롤로그 문자열, 다른 한편으로는, 항상 큰 따옴표 (")로 구분 과 문자 목록 (정수 코드 포인트)의 약어입니다. 몇 가지 예 :

  • "" 정확히 (원자 될 일이) 빈리스트 []과 동일합니다.
  • "abc"은 목록 [97,98,99]과 정확히 일치합니다.

그래서 당신은 당신이 원자 또는 문자열를 사용하는 것을 의미인지에 대해 명확해야한다. 당신은 원자에 대해 얘기하고 귀하의 예를 ... Sicstus 및 SWI 모두에서

에서 가정

당신은 name/2을 사용할 수 있어야합니다 프롤로그.특정 예를 들어, 당신은 할 수 있어야한다 간단하게 대답 :

foo(X , Y) :- 
    name('S' , [S]) , 
    name(X , Codes) , 
    name(Y , [S|Codes]) 
    . 

가 더 일반적으로, 당신이 말할 수 있어야한다 :

foo(AtomicPrefix , NumericSuffix , Concatenation) :- 
    name(AtomicPrefix , Pfx ) , 
    name(NumericSuffix , Sfx ) , 
    append(Pfx , Sfx , Codes) , 
    name(Concatenation , Codes) 
    . 

그러나, name/2는 ISO-호환되지 않습니다.

foo(X, Y) :- 
    number_chars(X,Xs) , 
    atom_chars(Y,['S'|Xs]) 
    . 

또는보다 일반적으로,

foo(AtomicPrefix , NumericSuffix , Concatenation) :- 
    atom_chars(AtomicPrefix , Pfx ) , 
    number_chars(NumericSuffix , Sfx ) , 
    append(Pfx , Sfx , Chars) , 
    atom_chars(Concatenation , Chars) 
    . 

을 또는 당신은이 라인을 따라 atom_concat\3을 사용할 수 있어야합니다 : 대신, 당신은 유사한 방식으로 atom_chars/2number_chars/2을 사용할 수 있습니다

foo(Atom , Number , Concatenation) :- 
    number_chars(Number, Ds) , 
    atom_chars(Sfx , Ds) , 
    atom_concat(Pfx , Sfx , Concatenation) 
    . 
관련 문제