2010-06-10 5 views
0

프로그램에서 결과를 포맷하려고하는데 어려움을 겪고 있습니다. 프롤로그 용어 연결

나는 결과로이 같은 것을주고 싶어 :

Res = do(paint(x) do(clean(a), do(repair(b) , initialState))) 

기본적으로, 나는에 연속적인 측면을 연결하려는 초기 상태 (Initial) 원자하지만, 그것은 다른 용어가 아니다 연결할 수 있기 때문에 atom_concat 작동하지 않습니다 원자도 추가하고 싶었습니다.) "do"함수를 통과 할 때마다).

그래서 다음과 같이됩니다. Res = initialState.

함수가 호출 할

, 나는

concatenateTerm(Pred, Res, Res). 

Pred를 가산 같은 함수 (b)는 예를 들어 수리 beeing는이 있고 결과 얻을 것입니다 : res = do(repair(b), 초기 상태 (Initial)를).

이 작업을 수행 할 수 있습니까?

감사

+0

아마도 당신을 이해하지 못 하겠지만, 나는 당신이'concatenateTerm (Pred, Res, ResNext)'라고 가정합니다. 이 경우 그것을'concatenateTerm (A, B, do (A, B)) '로 정의하십시오. – ony

+0

하지만 concatenateterm wouldnt 결과로 내 입술을 제공합니다. Temp = Res를 수행하고 Temp와 Pred를 연결하고 Res에 결과를 제공하는 concatenateTerm (Pred, Temp, Res)을 호출 할 수 있습니다. 그러나 atomic 이외의 조건으로 실패하기 때문에 atom_concat과 함께 작동하지 않습니다. 또한 마지막에 the)를 추가하지 않을 것입니다. – d0pe

+0

더 복잡한 용어를 사용하여 복잡한 용어를 구축하고 싶습니까? –

답변

1

like :

Res0 = initialState, 
do(repair(b), Res0, Res1), 
do(clean(a), Res1, Res2), 
do(paint(x), Res2, Res3), 

여기서 최종 결과는 Res3입니다. 프롤로그 프로시 저는 아무것도 반환하지 않으며 입출력 값은 인수를 통해 전달되어야한다는 것을 기억하십시오.

왜 연속적인 단어를 원자로 연결 하시겠습니까?initialState? 이건 프롤로그 방식이 아니야. 프롤로그에서는 매번 수정되는 구조를 만드는 것이 훨씬 자연 스럽습니다.

+0

프롤로그는 "반환"하지 않으며 "수정"하지 않습니다 (동적 조건과 관련된 특수한 경우는 제외). 일부 조건을 바꾸는 것도 좋지 않은 접근입니다. "수정"(실제로는 그렇지 않음)으로 볼 수있는 유일한 방법은 부분적으로 바운드 된 변수를 사용하는 것입니다. 일부는 부분적으로 바운드 된 변수 (예 : Res3 = do (paint (x) , Res2 = do (clean (a), Res1), Res1 = do (수리 (b), Res0), Res0 = initialState' 또는 멤버 ((빨강 = 파랑), X), 멤버 ((파랑 = 빨간색), X)'). 그러나 당신의 예제에서 어쨌든 당신은 조건의 * 연결 *을 가지고 있지 않으며'do/3'에 대해서만 호출합니다 – ony

+0

@ony 죄송합니다. 물론 용어의 연결이 있습니다. 'do/3'이 어떤 일을 할 때 그것은 "입력"용어에 더 많은 정보를 추가하고, 두 번째 인수는 세 번째 인수에 바인딩함으로써 "반환"합니다. 그래서'Res0'에 묶여있는 값은 수정되어'Res1'에 묶여 수정되고'Res2'에 바인딩되어 수정되고'Res3'에 바인딩됩니다. 변수를 통한 데이터의 * 연결 *은 Prolog에서 일반적이며 변수 명명은이를 나타냅니다. 'Res0' ->'Res1' ->'Res2' ->'Res3' – rvirding

-1

d0pe @는 프롤로그에서 어떤 결과 (그들은 내가 추측, 수성과 얼랑에 존재)의 머리에 통일/지정 아마 몸의 뒷부분에 통합에만라는 이름의 값이 존재하지 않는다. Temp = Res, Res = do(Pred, Temp)이 무한 반복적 인 용어 do(Pred, do(Pred, do(Pred, ...))) (적절한 확장자가있는 경우)을 생성하기 때문에 Temp = Res, concatenateTerm (Pred,Temp, Res)을 수행하는 것이 대부분의 경우 실패합니다. 나는 이것이 당신이 원하는 것이 아니라고 생각합니다.
하지만 이제는 을 수정 하시길 바랍니다.Res을 수정하십시오. 이는 Prolog에 대한 잘못된 이해입니다. 당신은 아마 당신의 규칙처럼 보일 (프롤로그에서 원숭이 + bananna의 예를 참조)합니다 다음 방법 Res0 = initialState, Res1 = do(repair(b), Res0), Res2 = do(clean(a), Res1), Res3 = do(paint(x), Res2).

를 사용한다, 어떤 변수가 없습니다 : 난 당신이 뭔가를 할 필요가 제대로 이해하면

solve(FinalState, finish, FinalState). % our initial state is our goal 

solve(InitState, do(Action, Future), FinalState):- 
    action(InitState, Action, NewState), 
    solve(NewState, Future, FinalState). 
+0

나는 @ d0pe가 방금 _을 구성하는 방법을 물었습니다 _ 어떤 형식의 출력을 포맷하십시오 _... 왜 당신은 (다소 혼란스럽게) 무한히 재귀적인 용어에 대해 이야기하고 바운드 변수를 수정하고 있습니까? – sharky

+0

@rati, 그리고 나는 * 용어를 만드는 방법을 개혁했다. "res = initialState, concatenateTerm (Pred, Res, Res), Pred = repair (b)"그리고'Res = do (repair()를 기대하고 있기 때문에 바운드 변수를 수정하고 바운드 변수를 수정하는 것은 언급된다. b), initialState)'이것은 @ d0pe처럼 보입니다. concatenateTerm은''처음''Res'를''repair (b)''를 연결하여''Res''로 리턴해야합니다. – ony

1

내가 방금 대신 원자을 구성하기 위해 노력하는 당신의 결과로 PROLOG 용어를 구성해야 할 수도에서 @rvirding에 동의합니다. 후자를 시도해도 (실제로 가능), 필요하다면 유틸리티 함수 (예 : SWI-PROLOG의 atom_to_term/3 또는 term_to_atom/2)를 사용하여 원자에서 용어로 변환하고 다시 변환 할 수 있습니다.당신이 이전에 설명한대로

어쨌든, 간단한 조건은 다음과 같이 볼 수 있었다 당신의 '상태'규정 및 출력 이러한 용어의 전체 목록을 취할 :

build_do_term([X,Y], do(X,Y)) :- !. 
build_do_term([X|Xs], do(X,Rem)) :- 
    build_do_term(Xs, Rem). 

은 국가의 조건으로이 술어를 호출 (최소 2 개 이상이어야 함) :

?- build_do_term([paint(x), clean(a), repair(b), initialState], Rem). 
Rem = do(paint(x), do(clean(a), do(repair(b), initialState))). 

... 이후에 설명 된 동작을 반영합니다. 목록에서 한 번에 모든 용어를 작성하고 싶지 않은 경우 위의 build_do_term/2에 사용 된대로 do/2 용어 작성 방법을 사용하여 필요에 따라 적절한 do/2 용어를 구성 할 수 있습니다.

+0

당신은 어떻게 목록에있는 * 용어를 이미 연결했는지 짐작 했습니까? [paint (x) | [청소 (a) | [... | []] ..]'do/2와의 * 연결과 똑같은 문제입니까? – ony

+0

@ d0pe가 작업중인 코드에 대해 추측하거나 추측하지 못했습니다. 'build_do_term/2 '에 대한 입력으로리스트 구조를 사용하는 목적은 간단한 방식으로 PROLOG 술어가 다음과 같이 (필요한)'do/2'를 구축하기 위해 어떻게 구현 될 수 있는지를 설명하는 것입니다. d0pe가'concatenateTerm/3'과 같은 것을 원했기 때문에 가이드입니다. 나는 이것이 게시물의 마지막 성명서에서 분명하다고 생각합니다. : - \ – sharky