List 录音数据库的Prolog程序
我有三类事实:List 录音数据库的Prolog程序,list,prolog,List,Prolog,我有三类事实: album(code, artist, title, date). songs(code, songlist). musicians(code, list). 例如: album(123, 'Rolling Stones', 'Beggars Banquet', 1968). songs(123, ['Sympathy for the Devil', 'Street Fighting Man']). musicians(123, [[vocals, 'Mick Jagg
album(code, artist, title, date).
songs(code, songlist).
musicians(code, list).
例如:
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']].
我需要创建以下4条规则:
如果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,W),它确实可以工作
是否有其他方法可以将列表作为变量插入
至于其他规则,我完全不知所措。任何帮助都将不胜感激。您对Prolog有一个误解:在Prolog中回答目标与调用函数不同! 例如:您希望在执行“角色(X,Y):-prole(X,Y,muchers(uu,W))”时,将评估“muchers(u,W)”,因为它是“prole”的参数。Prolog不是这样工作的。在每一步中,它都试图用一个存储的谓词统一目标,并且所有参数都作为变量或固定项处理。 正确的方法是:
role(X,Y) :- musicians(_, L), prole(X,Y,L).
第一个目标将L与音乐家列表结合起来,第二个目标找到角色(假设其余代码正确)。小Bobby Tables是正确的,您需要理解Prolog的声明式风格。您的目标是提供一组与数据库中的一组事实相匹配的规则 非常简单,假设我有以下数据库
guitarist(keith).
guitarist(jim).
in_band('Rolling Stones', keith).
in_band('Rolling Stones', mick).
假设我想知道谁是滚石乐队的吉他手和吉他手。我可以用这样的规则
stones_guitarist(X):-
guitarist(X),
in_band('Rolling Stones', X).
当一个变量名在规则中给出时(在本例中为X),它在规则中保持其值,因此我们要说的是,作为吉他手的X也必须与“滚石乐队”中的X相同
有很多可能的方法可以安排数据库。例如,如果音乐家的名字本身就是一个列表(例如[吉他,[基思,布赖恩]]),可能会更容易
我希望下面的示例对song(X,Y)有所帮助。我使用的是Sicstus Prolog,所以导入列表库以获取“member”,但是如果您没有,那么您可以很容易地自己创建它
:- use_module(library(lists)).
song(ARTIST,SONG):-
album(CODE,ARTIST,_,_),
songs(CODE,TRACKS),
member(SONG,TRACKS).
如果你有家庭作业,那么就这样做。告诉我们你有什么想法,我们会尽力帮助。。。