2012-03-11 5 views
2

나는 프롤로그 (이클립스)의 시나리오에서 리 포맷 된 목록 구조가 필요합니다. 나는 내가 + 연산자로 대체 모든 쉼표로 하나의 요소에 목록을 평평하게 할 수 있는지 확인하기 위해 노력했다프롤로그의 목록 안에 쉼표 대신 plus 연산자를 사용하여 목록 이동

MyList = [a,b,c]. 

:

나는 형태의 목록을 가지고있다. 하나의 요소 목록입니다

ResultList = [a+b+c] 

:

그래서 내 결과 목록과 같을 것이다. 초기 목록의 길이는 임의적입니다.

프롤로그가 그런 작업에는 적합하지 않지만이 작업을 수행 할 수 있습니까?

답변

4

입니다.

list_to_op([X,Y|T], [R]) :- 
    list_to_op(T, X+Y, R). 

편집 : 나는 이클립스에 차이점이 없습니다 생각 버그가 거짓

list_to_op([X], [X]). 

list_to_op([X], R, R+X). 
list_to_op([X|T], R, Q) :- 
    list_to_op(T, R+X, Q). 

시험에 의해주의 :

어큐뮬레이터는 적절한 연관성을 제공하는 데 필요한
?- list_to_op([a,b,c],X). 
X = [a+b+c] . 

: 더 간단하고 직관적 인 정의

list_to_op1([X], X). 
list_to_op1([X|R], X+T) :- 
    list_to_op1(R, T). 

는 평가 순서가 중요하다면

?- list_to_op1([a,b,c],X). 
X = a+ (b+c) . 

이 list_to_op를 사용할 수 있습니다.

편집 : list_to_op ([a, b], X)가 실패했습니다. 여기 보정

이 자주 발생, 그것은 단순화입니다 :

list_to_op([], R, R). 
list_to_op([X|T], R, Q) :- 
    list_to_op(T, R+X, Q). 
+0

고맙습니다. 내가 뭘 찾고 있었는지. – kallakafar

+0

죄송합니다, 버그를 발견했습니다. 편집 – CapelliC

+0

@chac'list_to_op ([3], Op)'이 (가) 실패합니다. 예정된? – false

1

flatten_list(A,[B]) :- flatten_list_inner(A,B). 

flatten_list_inner([A],A). 
flatten_list_inner([H|T],H+Y) :- flatten_list_inner(T,Y). 

출력은 당신이 원하는 것과 약간 다릅니다 도움이 될 수 있습니다. 현재 표준 [Prolog]에있는 [a + (b + c)]

+0

거의 (술어와 인수 이름을 제외하고) 나는 지난 몇 달 동안이 글을 쓰고 사용했습니다. +는 중위 연산자이므로 ** flatten_list_inner/2 **의 복합어가 작성되면 이러한 성가신 괄호가 나타납니다. 그러나 그러한 용어는 ** is/2 ** (원자 a, b, c가 숫자로 대체되는 경우)로 평가할 수 있습니다. – hardmath

0

이 비 재귀 버전에 대해 ..

list_to_op(L, Res) :- 
    concat_atom(L, '+', Atom), 
    Res = [Atom]. 


?- list_to_op([a,b,c], X). 
X = ['a+b+c']. 

편집 방법 : 이것은 스위스 925 - 프롤로그에서 작동 ..하지 Eclipse에 관해서.