2016-06-26 4 views
2

다음 코드는 작동하지만 후드에서 어떻게 작동하는지에 대해 확실한 의문이 있습니다. 예를 들어, Exit (9)에 대한 첫 번째 호출에서 C가 변수 O로 어떻게 옮겨 졌는지 이해하지 못합니다.이 부분이 통일 프로세스인가 아니면 완전히 다른 것입니까? 설명 할 누군가를 돌보지 않겠습니까?프롤로그 통일 프로세스 (concat)

concat([], List, List). 
concat([Head|[]], List, [Head|List]). 
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat([Head], C, Concat). 

trace

답변

1
해서 인증, 통일 프로세스의 손에 의해 "할 수

추적 선 표지 종료한다 : (9) 실제로 [C] [X, Y의 '단점 혼성' Z] :

?- concat([a,b,c],[x,y,z],L). 
L = [a, b, c, x, y, z] ; 
L = [a, b, c, x, y, z] ; 
... 

이 종료되지 않습니다

?- [Head|[]]=[c],List=[x,y,z],[Head|List]=O. 
Head = c, 
List = [x, y, z], 
O = [c, x, y, z]. 

을하지만, 당신은 그것을 작동 주장 할 수 없습니다이며 이는 분명히 몇 가지 문제점을 나타냅니다. 두 번째 절은 행동과 구문 모두에서 중복됩니다. 그것은 보통 모든 목록에서 암시 현재의 빈 꼬리 목록 이후

concat([Head], List, [Head|List]). 

과 같이 기록 될 것입니다 - 꼬리가 명시 적으로 표시되는 경우를 제외하고 :

?- [Head|[]]=[X]. 
Head = X. 

행동에 대해, 당신은에서 볼 수있다 귀하의 흔적은 결코 사용되지 않는 첫 번째 절입니다. 그래서, 그것이 중복 된 첫 번째라고 생각할 수 있습니다 - 어쩌면 당신은 'singleton'리스트가 필요한 세 번째 절의 마지막 호출 때문에 두 번째를 추가했을 것입니다 (나는 ...,concat([Head], C, Concat).을 의미합니다). 그러나 그러한 전화는 비 종결 문제를 야기하고 있습니다. 두 번째 절을 제거하고 세 번째 절을 단순화하는 전체 프로그램을 단순화하는 것이 더 좋습니다.