2014-10-20 3 views

답변

0

replace(['_'|As], [_|Bs])과 일치하는 모든 입력은 replace([A|As], [B|Bs])과 일치합니다. 이것은 첫 번째 절이 실행되는 동안 후자의 경우에 선택 점이 남음을 의미합니다.

프롤로그가 첫 번째 결과를 찾은 후에도 여전히 선택 지점이 열려 있으므로 더 많은 결과가 필요한지 묻습니다. 네가 '예'라고 대답하면 다른 조항을 실행하지 않습니다. A \= '_'이 사실이 아니기 때문에 항상 실패합니다.

이 동작은 잘못된 것은 아닙니다. '거짓'은 프로그램이 실패했다는 의미가 아니라 이미 제시된 결과가 발견 된 후에 더 이상 결과가 없다는 것을 의미합니다. 이 경우, 당신은 항상 하나 개의 결과 만이있을 것이라는 점을 알고있다, 그래서 당신은 다음과 같이 절단 연산자 !를 사용하여 열려있는 선택의 여지 포인트를 남기지 않도록 프롤로그 알 수 있습니다 :

replace(['_'|As], [_|Bs]) :- 
    replace(As, Bs), !. 

이 본질적으로 프롤로그를 알려줍니다 그이 경우 절이 성공하면 나머지 일치 항목은 더 이상 고려되지 않아야합니다. 따라서 선택 지점을 열어 두지 않고 첫 번째 결과를 얻으면 실행이 완료되고 true를 반환합니다.

관련 문제