2010-04-04 2 views
2

의 Recordings 데이터베이스 :프롤로그 프로그램 나는 사실의 세 가지 유형이

album(code, artist, title, date). 

songs(code, songlist). 

musicians(code, list). 

예 :

나는이 4 개 규칙을 만들 필요가
album(123, 'Rolling Stones', 'Beggars Banquet', 1968). 

songs(123, ['Sympathy for the Devil', 'Street Fighting Man']). 

musicians(123, [[vocals, 'Mick Jagger'], [guitar, 'Keith Richards', 'Brian Jones']]. 

:

함께

(X, Y) X와 Y가 같은 앨범에서 재생되면 성공합니다.

artistchain (X, Y) X에서 Y까지 앨범 체인이 존재하는 경우 성공합니다. 두 명의 음악가가 '함께'체인으로 연결됩니다.

역할 (X, Y) X에 Y 역할 (예 : 기타)이있는 경우 성공합니다. 아티스트 X가 노래 Y.

어떤 도움을 기록하는 경우

노래 (X, Y) 이것은 성공?

나는 많이 있지만위한 역할 (X, Y)을 마련 할 수 없었던 내가 해낸 :

role(X,Y) :- prole(X,Y,musicians(_,W)). 

prole(X,Y,[[Y|[X|T]]|Z]). 
prole(X,Y,[[Y|[H|T]]|Z]) :- prole(X,Y,[[Y|T]|Z]). 
prole(X,Y,[A|Z]) :- prole(X,Y,Z). 

그러나 그것은 작동하지 않습니다. 수동으로 [[1,2,3], [4,5,6]]와 같이 뮤지션 (_, W) 대신 목록에 입력하면 작동합니다.

다른 방법으로 목록을 변수로 삽입 할 수 있습니까?

다른 규칙들에 관해서는 나는 완전한 손실에 처해 있습니다. 어떤 도움이라도 정말로 감사 할 것입니다.

+0

숙제 인 경우 해당 사항을 표시하십시오. 어떤 아이디어가 떠오르면 도와 드리겠습니다. – 3lectrologos

답변

1

Prolog에 대한 오해 : Prolog에서 목표에 응답하는 것이 함수를 호출하는 것과 다릅니다! 예 : "역할 (X, Y) : - prole (X, Y, 음악가 (_, W))." 가 실행되면, "뮤지션 (_, W)"은 "prole"의 주장이기 때문에 평가 될 것입니다. 이것은 프롤로그가 작동하는 방식이 아닙니다. 각 단계에서 목표는 저장된 술어로 통합하려고 시도하며 모든 인수는 변수 또는 접지 된 용어로 처리됩니다.

role(X,Y) :- musicians(_, L), prole(X,Y,L). 

첫 번째 목표는 음악가의 목록 L를 통합, 두 번째 목표는 (코드의 나머지 부분이 올바른지 가정) 역할을 찾습니다 그것을 할 올바른 방법입니다.

0

작은 바비 테이블이 맞습니다. Prolog의 선언 스타일을 이해해야합니다. 귀하의 목표는 데이터베이스의 사실 집합과 일치하는 일련의 규칙을 제공하는 것입니다.

은 아주 간단하게, 나는 다음과 같은 데이터베이스

guitarist(keith). 
guitarist(jim). 
in_band('Rolling Stones', keith). 
in_band('Rolling Stones', mick). 

나는 기타리스트 와 롤링 스톤즈의 모두 누구인지 찾으려면 세웠이 상상. 변수 이름 (이 경우 X에) 규칙 내에서 주어지면 내가 규칙 동안 그 가치를 보유하고이

stones_guitarist(X):- 
    guitarist(X), 
    in_band('Rolling Stones', X). 

같은 규칙을 사용할 수 있습니다, 그래서 우리가 말하고있는 것은 X가을 인 것입니다 기타리스트는 '롤링 스톤즈'라는 밴드에있는 것과 같은 X 여야합니다.

데이터베이스를 정렬하는 데는 여러 가지 방법이 있습니다.예를 들어, 음악가의 이름 자체가 목록 (예 : [기타, [키스, 브라이언]) 인 경우 더 쉬울 수도 있습니다.

노래 (X, Y)에 대한 다음 예제가 도움이되기를 바랍니다. 저는 Sicstus Prolog를 사용하고 있으므로 목록 라이브러리를 가져 와서 '회원'을 얻지 만, 갖고 있지 않으면 직접 만들 수 있습니다.

:- use_module(library(lists)). 
song(ARTIST,SONG):- 
    album(CODE,ARTIST,_,_), 
    songs(CODE,TRACKS), 
    member(SONG,TRACKS). 
관련 문제