2012-10-12 1 views
2

* 안녕하세요, 터보 프롤로그에서 C = A-> 입력 할 경우 구문 오류가 발생하면 목록의 요소를 다른 목록으로 바꾸려고합니다. 결과 목록 (L1) 요소를 대체하는 목록 이 터보 프롤로그에서 일 것입니다 경우 모르겠어요프롤로그가 목록의 다른 요소를 다른 목록으로 바꿉니다.

concat([],L,L). 
concat([H|T],L,[H|Res]) :- concat(T,L,Res). 

repl([],_,_,[]). 
repl([Val|T],Val,Repl,Res) :- repl(T,Val,Repl,Temp), concat(Repl,Temp,Res). 
repl([H|T],Val,Repl,[H|Res]) :- repl(T,Val,Repl,Res). 

,하지만 그것을 잘 작동합니다 : 도움을

domains 
    list=integer* 
    element=i(integer);l(list) 
    lista=element* 
predicates 
    repl(list,integer,list,lista) 
clauses 
    repl([],A,B,[]):-!. 
    repl([C|L],A,B,**[l(|L1])**:- C=A,repl(L,A,B,L1),!. 
    repl([C|L],A,B,[i(C)|L1]):- repl(L,A,B,L1),!. 

감사, 문제 해결 (사용 dasblinkenlight 코드)

+0

제 3의 답장에서 L1 (누가 유형이 요소인지), 그 머리에 모든 목록 B (누가 요소의 대체인지)를 넣으려고합니다. – user1741409

+0

"구문 오류"가보고되면서 일반적인 구문 오류입니다. 힌트 : [l (| L1] – NotAUser

답변

1

이 시도 SWI에서는 내장 된 술어를 사용하지 않습니다. 규칙의

concat/3 쌍의 위치에서 결과 목록에 위치 1과 2의 목록을 연결합니다 3.

  • 빈 목록에 오는 첫 번째 repl 거래; 싱글 톤 변수를 밑줄로 대체하는 것을 제외하고는 당신과 동일합니다. (매우 권장되는 방법입니다)
  • 두 번째 규칙은 대체 할 값 Val이 목록의 맨 위에있는 상황을 처리합니다. 꼬리 부분의 값을 대체하고 대체 목록 Repl을 교체 결과 Res과 연결합니다.
  • 머리 값이 Val과 일치하지 않는 경우 마지막 규칙이 적용됩니다. 한 단계 아래로 재귀 호출하고 초기 목록의 머리를 대체 결과의 맨 앞에 추가합니다.

부수적으로 잘라 내기 연산자 !은 거의 필요하지 않습니다. 이 문제의 경우, 당신은 분명히 그것없이 할 수 있습니다.

+0

신사. 도움 주셔서 대단히 감사합니다. – user1741409