처음에는 프로그램에 약간의 오류가 있습니다. 라인 Total = Head + Sum
은 Total
이 두 개의 인수가있는 +
구조임을 의미합니다. 산술 평가를 의미하는 =
대신 아마도 is
을 의미합니다. 하지만 가장 좋은 방법은 대신 #=
을 사용하는 것입니다.
질문에서 은 프로그램이 수행 할 내용을 묻습니다.. 이는 명령 지향적 인 (명령형) 언어에서 상당히 합리적인 질문입니다. 프로그램에서 얻을 수있는 유일한 의미는 단계별 조치이기 때문입니다. 그러나 여기 Prolog에서는 상황이 조금 다릅니다. 그 단계별 사고를 적용하려고 시도 할 수는 있지만 조만간 Prolog는 하나의 제어 흐름이 없지만 동시에 두 개 (AND 및 OR) 호출이 필요하기 때문에 상황이 극도로 복잡해질 수 있음을 알게 될 것입니다. 제어). 심지어 "데이터 구조"도 다릅니다 ...
그러나 명령형 언어로는 상응하지 않는 Prolog 프로그램을 읽을 수있는 방법이 있습니다. 프로그램을 인수 간의 관계로 이해할 수 있습니다. 이러한 방식으로, 당신은 절차 적 측면에서 관계가 어떻게 보이는지에 집중할 수 있습니다. 어쨌든 묘사 된 관계가 틀린 경우에, 프로그램이 이것을 어떻게하는지 질문하는 아무 점도 없다.
그래서 제가 프로그램을 바꿔 보자 먼저 첫 번째 조건의 list_sum을 확인합니다
:- use_module(library(clpfd)).
list_sum([], 0).
list_sum([E|Es], S) :-
S #= E+T,
list_sum(Es, T).
([], 0). 조건이 충족되지 않으면 목록을 H와 T의 두 부분으로 나눕니다.
귀하의 질문은 단일 제어 흐름 ("그와 같은 일반적인 구성입니다.")이라는 것을 의미합니다. 그러나 그것은 다르게 작동 할 수도 있습니다. 쿼리를 생각해
?- list_sum(Xs,0).
Xs = [] ;
Xs = [0] ;
Xs = [_G1710, _G1713],
_G1710+_G1713#=0 ...
가 여기에 우리가
에게 무엇을 나열하는 것은 누구의 합이 0이다 존재한다. 이제 "동안"은 더 이상 의미가 없습니다.
답변은 다음과 같습니다. 빈 목록. 0
와의 목록; 요소의 합이 0 인 2 요소 목록. 등 ...
이러한 프로그램을 이해하는 가장 좋은 방법은 지금과 같은 관계로 읽을 것입니다 :
list_sum([], 0
: 빈 목록은 합계 0 있습니다.
규칙이 이제 오른쪽에서 왼쪽 인 :-
화살표의 방향으로 가장 읽
list_sum(Es, T).
* Es
제공되는 합 T
와 목록 ...
이다
S #= E+T
... S
은 ... E
플러스 T
입니다
:-
... 그럼 우리는 결론을 내릴 수 있습니다 ...
list_sum([E|Es], S)
: S
은 목록의 합이 [E|Es]
입니다.
이런 식으로 절차상의 세부 사항을 너무 많이 언급하지 않고도 이러한 것들을 이해할 수 있습니다. 이해가 끝나는 것처럼 더 많은 것이 있습니다 failure-slice을 참조하십시오.
정말 고맙습니다. 고맙습니다. 신의 축복이 있습니다. 처음에는 그것을 이해하기가 너무 어려웠습니다. 하지만 당신은 모두 나를 위해 간단하게 명확하게 만들었습니다. – user3018890
"102로 돌아 오는"등의 좋은 설명은 약간의 오해의 소지가 있습니다. 특히 절차 적 사고를하는 데 익숙한 사람에게는 더욱 그렇습니다. 프롤로그 절은 값을 반환하지 않습니다. 그들은 전혀 "돌아 오지 않는다". "X가 102로 묶여서 성공"하는 것과 같은 말을하는 것이 더 정확할 것입니다. –
@TedHopp 나는 그것에 대해서도 생각했습니다. 반환은 약간 오도하는 것입니다. "with"를 추가하여 값이 절차 적 의미에서 "반환"되지 않는다는 것을 암시합니다. 나는 당신의 말씨가 내 것이 낫다는 것을, 그러나, - 훌륭한 코멘트를 주셔서 감사합니다! – dasblinkenlight