2014-11-22 2 views
0

의이 같은 데이터베이스가 있습니다하지 프롤로그에서 사용 Bagof

movie(matrix,wachowski,thriller). 
movie(terminator, cameron, thriller). 
movie(Gladiator, scott, costume). 
movie(star wars, lucas, fantasy). 
movie(star trek, abrams, fantasy). 

을 그리고 브람스를 제외하고 판타지 영화를 직접 누구인지 알고 싶습니다. 'not'술어를 사용해야 겠지만, 어떻게 작동하는지 정확히 알지 못합니다.

?- movie(X,not(abrams),fantasy). 

하지만 불행히도 작동하지 않습니다.

?- movie(X,_,not(thriller)). 

가 여전히 작동하지 :

하나 개 더 쿼리는 영화의 종류 스릴러없는 것입니다.

다음 문제는 bagof를 기반으로하는 술어 direct(Director, listsOfMovie)을 사용해야합니다. 당신은 프롤로그 함수와 같은 술어를 사용할 수 없습니다

답변

0

사용 not

의 성공 :(

누구나 도움을 줄 수없는 또

?- direct(Director, listsOfMovie) :- bagof(Director,movie(Director,listsOfMovie,_), listsOfMovie). 

?. not/1은을 받아들이는 조건입니다 쿼리를 인수로 사용하므로 생각한 바가 없습니다.

movie(X,not(abrams),fantasy). 

두 번째 인수가 not(abrams)movie을 쿼리합니다. movie(_, not(_), _)과 일치하는 사실이나 술어가 없으므로 항상 실패합니다. 이 영화는 스릴러하지 않았다 알고 싶다면

, 당신은 그것을 렌더링 수 있습니다 not를 사용

movie(X, _, Type), 
Type \= thriller.` 

, 그것은 수 있습니다 :

not(movie(X, _, thriller)). 

당신이 일을 movie(_, not(_), _)의 구문을 원한다면 , 당신은 그것에 대한 술어를 쓸 수 있습니다 :

movie(Name, not(Director), Type) :- 
    movie(Name, D, Type), 
    D \= Director. 

이제 우리는 fac t 또는 양식 movie(_, not(_), _)과 일치하는 쿼리 머리글 movie(X, not(abrams), Y)이 작동하는 술어 헤드 그러나 일반적으로 이렇게하지는 않습니다. bagof/3

이의이 bagof의 사용을 살펴 보자 사용

. 가장 간단한 경우, bagof이 세 가지 인수 걸릴 것으로 예상되는 : 고유 ListOfSatisfingXs, 생성,

bagof(X, {query involving X}, ListOfSatisfingXs) 

그래서 bagof이 사실하는 각 X를 생성하는 {쿼리를 포함하는 X}을 실행을, 같은 목록을 분류 X의 인스턴스입니다.즉, ListOfSatisfingXsX의 고유 한 정렬 값으로 {query involving X}을 성공으로 만듭니다. 귀하의 경우에는

, 당신은 bagof에 인수를 오긴했는데 약간 혼합 : 여기

direct(Director, listsOfMovie) :- 
    bagof(Director, movie(Director, listsOfMovie, _), listsOfMovie). 

, 당신은 그렇지 않은 이후 (좋지 않은 당신의 bagof 인수로 Director 인수를 재사용하고 예정된). 영화 목록을 찾고 있기 때문에 첫 번째 인수가 영화를 대표해야합니다. movie에 대한 쿼리는 목록 결과를 보관할 의도 된 대상 인수 인 listsOfMovie을 사용하고 있습니다. 그리고 마지막으로 listsOfMovie은 대문자로 시작하지 않으므로 변수가 아닌 원자입니다.

수정 된 버전은 다음과 같습니다 여기

director_movies(Director, ListOfMovies) :- 
    bagof(Movie, movie(Director, Movie, _), ListOfMovies). 

에서, bagof이 * 고유지고, movie(Director, Movie, _) 사실과 제공되도록 Movie 값 목록을 분류하는 ListOfMovies의 목록을 결과.

+0

Thansk 많이 있지만 bagof는 어떨까요? 그것을 해결하는 방법을 알고 있습니까? – user3136858

+0

@ user3136858 당신의'director' 술어가'bagof'로 무엇을하길 원하는지는 명확하지 않습니다. 주어진 감독의 영화 목록이나 특정 영화 또는 영화 목록의 감독 목록을 얻고 싶습니까? – lurker

+0

주어진 감독의 영화 목록 :) – user3136858