선언적으로 생각해보기 : 술어가 설명해야하는 것을 고려하십시오. 스코어, 제목 및 점수의 목록과 제목의 목록 사이의 관계는 첫 번째 인수의 점수와 일치합니다. 술어를 설명하는 이름을 찾는 것이 도움이된다는 것을 알았습니다. 여기서 어떤 인수가 무엇인지를 즉시 볼 수 있습니다. 그래서 score_list_titles/3 같은 것을 사용하지 마십시오. 그렇다면 내 설명에 어떤 경우가 있는지 생각해 봅니다.
score_list_titles(_S,[],[]). % 1: if list is empty titles is empty
score_list_titles(S,[[T,S]|TSs],[T|Ts]) :- % 2: if score matches S, T is in titles
score_list_titles(S,TSs,Ts). % relation must hold for the tails as well
score_list_titles(S,[[T,X]|TSs],Ts) :- % 3: if score
dif(S,X), % doesn't match S, T is not in titles
score_list_titles(S,TSs,Ts). % relation must hold for the tails as well
이 술어는 다음과 같은 결과를 쿼리 : 각각 100, 200, 300의 점수가 제목이 관계를 위해 나는 세 가지 사례를 참조?
?- score_list_titles(100,[['title1',100],['title2',200],['title3',100]],T).
T = [title1,title3] ? ;
no
?- score_list_titles(200,[['title1',100],['title2',200],['title3',100]],T).
T = [title2] ? ;
no
?- score_list_titles(300,[['title1',100],['title2',200],['title3',100]],T).
T = []
득점에는 어떤 제목이 있습니까?
?- score_list_titles(S,[['title1',100],['title2',200],['title3',100]],T).
S = 100,
T = [title1,title3] ? ;
S = 200,
T = [title2] ? ;
T = [],
dif(S,100),
dif(S,200),
dif(S,100)
당신은 if_/3를 사용하여 더욱 컴팩트하게이 관계를 표현할 수있다 :
score_list_titles(_S,[],[]).
score_list_titles(S,[[T,X]|TSs],TL) :- % if S=X: T is in titles
if_(S=X, TL=[T|Ts], TL=Ts), % otherwise it isn't
score_list_titles(S,TSs,Ts). % relation must hold for the tails as well
술어도 처음 두 개의 인수가있는 경우 열린 불필요한 선택 점을 떠나지 않아이 방법을 ground (= 자유 변수를 포함하지 않음). 위의 쿼리와 위의 쿼리를 비교하면 다음과 같은 결과를 얻을 수 있습니다. score_list_titles/3의 위 버전에서 단일 응답 후에 ;
을 입력해야만 피드백을 얻을 수 있습니다. ';'답변 후
return_title(Score,List,X):-
member([X,Score],List).
는 당신은 findall은/3, REPL의 역 추적 (히트처럼 '모든 솔루션'내장 명령을, 프롤로그를 사용할 수 있습니다 : 당신이 필요한 것보다 더 복잡하고있는
?- score_list_titles(100,[['title1',100],['title2',200],['title3',100]],T).
T = [title1,title3]
?- score_list_titles(200,[['title1',100],['title2',200],['title3',100]],T).
T = [title2]
점수가 같거나 더 높아야합니까? –
둘째로 이들은 함수가 아니며 함수는 물건을 반환하지 않고 물건을 인스턴스화합니다. 이것은 큰 차이 (기본적으로 로직과 명령형 프로그래밍의 차이)입니다. –
점수가 무작위이므로 2 ~ 3 명이 같을 수 있습니다. 그래서 2 ~ 3 개의 제목을 인쇄해야합니다! (추신 : 기능 용어 미끄러 져 .. 내가 프롤로그를 처음 사용하는 경우) –