2016-01-20 48 views
3

中一旦我有這個KB(知識庫):情況只出現知識庫

%artist(ArtistId, ArtistName, YearofDebut). 
%album(AlbumId, AlbumName, YearOfRelease, Artists). 
%song(AlbumId, Songname, Duration). 

%artist/3 
artist(1, 'MIEIC', 2006). 
artist(2, 'John Williams', 1951). 
artist(3, 'LEIC', 1995). 
artist(4, 'One Hit Wonder', 2013). 


%album/4 
album(a1, 'MIEIC Reloaded', 2006,[1]). 
album(a2, 'Best Of', 2015, [2]). 
album(a3, 'Legacy', 2014, [1,3]). 
album(a4, 'Release', 2013, [4]). 

%song/3 
song(a1, 'Rap do MIEIC', 4.14). 
song(a2, 'Indiana Jones', 5.25). 
song(a1, 'Pop do MIEIC', 4.13). 
song(a2, 'Harry Potter', 5.13). 
song(a1, 'Rock do MIEIC', 3.14). 
song(a2, 'Jaws', 3.04). 
song(a2, 'Jurassic Park', 5.53). 
song(a2, 'Back to the Future', 3.24). 
song(a2, 'Star Wars', 5.20). 
song(a2, 'E.T. the Extra-Terrestrial', 3.42). 
song(a3, 'Legacy', 3.14). 
song(a3, 'Inheritance', 4.13). 
song(a4, 'How did I do it?', 4.05). 

而且我想,詢問專輯是單一(只拿到一首歌曲)查詢。

recentSingle(+ AlbumId)。

recentSingle(a1) ? 
No 

recentSingle(a4) ? 
Yes 

如何在整個KB搜索和檢查,如果只出現一次?

答:

recentSingle(AlbumId) :- album(AlbumId, _, Year, _), 
         Year > 2010, 
         \+ isNotSingle(AlbumId). 


isNotSingle(AlbumId) :- song(AlbumId, Name1, _), 
         song(AlbumId, Name2, _), 
         Name1 \= Name2. 

問候

回答

-1

嘗試這樣

recentSingle(X) :- aggregate_all(count, song(X, _, _), Count), Count = 1. 

某事,這應該工作太

recentSingle(X) :- aggregate_all(count, song(X, _, _), 1). 
+0

編輯用的swer。 – Perseverance

+0

即使'? - recentSingle(a4).'成功,查詢'? - recentSingle(X).'失敗! – repeat

+0

@repeat感謝您指出 - 我仍然只學習Prolog。什麼是解決方案?你如何回答OP? – TrojanName