사용 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
의 인스턴스입니다.즉, ListOfSatisfingXs
은 X
의 고유 한 정렬 값으로 {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
의 목록을 결과.
Thansk 많이 있지만 bagof는 어떨까요? 그것을 해결하는 방법을 알고 있습니까? – user3136858
@ user3136858 당신의'director' 술어가'bagof'로 무엇을하길 원하는지는 명확하지 않습니다. 주어진 감독의 영화 목록이나 특정 영화 또는 영화 목록의 감독 목록을 얻고 싶습니까? – lurker
주어진 감독의 영화 목록 :) – user3136858