2016-06-08 2 views
1

제목과 점수가 포함 된 목록 목록이 있습니다 : [ [ 'title1',100 ],[ 'title2',200 ],...]. 내가 특정 점수를 가지고 있다면 제목을 반환하는 술어를 만들어야합니다. find_title(Score,List,ListOfTitles). 또한 일부 점수는 동일한 목록에 저장하려고하는 이유가 같을 수 있습니다. 같은 점수를 가진 제목이 둘 이상인 경우.목록의 목록에서 반환 요소 - 프롤로그

나는이 시도 :

return_title(Score,List,[H|T]):- 
    return_title(Score,List,T), 
    member([X,Score],List), 
    H=X. 

을하지만 다른 구현에 대한 아이디어를 work..any하지 않는 이유는 무엇입니까?

+0

점수가 같거나 더 높아야합니까? –

+0

둘째로 이들은 함수가 아니며 함수는 물건을 반환하지 않고 물건을 인스턴스화합니다. 이것은 큰 차이 (기본적으로 로직과 명령형 프로그래밍의 차이)입니다. –

+0

점수가 무작위이므로 2 ~ 3 명이 같을 수 있습니다. 그래서 2 ~ 3 개의 제목을 인쇄해야합니다! (추신 : 기능 용어 미끄러 져 .. 내가 프롤로그를 처음 사용하는 경우) –

답변

7

선언적으로 생각해보기 : 술어가 설명해야하는 것을 고려하십시오. 스코어, 제목 및 점수의 목록과 제목의 목록 사이의 관계는 첫 번째 인수의 점수와 일치합니다. 술어를 설명하는 이름을 찾는 것이 도움이된다는 것을 알았습니다. 여기서 어떤 인수가 무엇인지를 즉시 볼 수 있습니다. 그래서 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] 
관련 문제