2011-07-29 5 views
0

입력 목록에 [asd, qweqwe, fsdf, lkasd]가 있습니다. 코드에서 볼 수 있듯이 목록의 각 상수를 연결하여 단일 변수 목록을 출력하고 싶습니다. yap prolog를 사용하면이 코드를 참조하고 다음과 같이 작성합니다. - 실행하십시오. write 함수는 'asd, asd2, asd3, asd4'가 아닌 _G1233을 출력합니다. 왜? 어떻게 내가 출력 코드 'asd, asd2, asd3, asd4'를 변경해야합니까?Prolog 상수 문자열 목록

run :- toAtomicVars([asd,asd2,asd3,asd4],',',Out), 
write(Out),nl. 


toAtomicVars([],In,Out). 
toAtomicVars([A|B],In,Out) :- 
atomic_concat(A,In,Out1), 
atomic_concat(',',Out1,Out2), 
toAtomicVars(B,Out2,Out2). 

답변

0

당신이 정말 그나마 그 변수가 무엇이든 할 수 있다는 것을 의미한다

Singleton variables: [In,Out] 
Singleton variables: [Out] 

같은 경고를 (해야) :

toAtomicVars([],In,Out). 

및 출력이 될 수있는 일, 그래서 프롤로그를 변수가 인스턴스화되지 않았다는 것을 의미하는 더미 값 _Gsomething을 인쇄합니다.

같은 일이 두 번째 절에 발생합니다

toAtomicVars([A|B],In,Out) :- 
    atomic_concat(A,In,Out1), 
    atomic_concat(',',Out1,Out2), 
    toAtomicVars(B,Out2,Out2). 

당신이 아웃 아무데도 무슨 말을 해달라고.

개인적으로 난 그냥 재귀 적으로 각 변수를 인쇄 한 후, 같은 쉼표를 인쇄하면 쉽게 될 것이라고 생각 :

print_list([X]):- 
    write(X). 
print_list([H|T]):- 
    write(H), 
    write(', '), 
    print_list(T). 

을하지만 당신은 목록에 쉼표를 넣어하려는 경우 당신은 규칙을 추가한다 Out을 정의합니다.

+0

toAtomicVars ([A | B], 입출력) - atomic_concat (A, 입출력 아웃) atomic_concat (','아웃, 아웃 2) toAtomicVars (B, 아웃 2). 이걸 어떻게 생각하니? –

+0

toAtomicVars ([A | B], Out)와 같은 것을 시도하십시오 : - atomic_concat (A, ',', O1), toAtomicVars (B, O2), atomic_concat (O1, O2, O).AtomicVars ([a, b, c, d], Out)를 호출하면 O1은 'a'가되고 O2는 'b, c, d'가됩니다. 그러면 연결되어 'a, b, CD' –