Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 录音数据库的Prolog程序_List_Prolog - Fatal编程技术网

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).

如果你有家庭作业,那么就这样做。告诉我们你有什么想法,我们会尽力帮助。。。