2016-01-20 49 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