Prolog查询练习-初学者

Prolog查询练习-初学者,prolog,Prolog,我是Prolog的乞丐,在这个练习中需要一些帮助,这是提供的知识库: album(‘R. Stevie Moore’, ‘Manuscription’). album(‘Lane Steinberg’, ‘Manuscription’). album(‘R. Stevie Moore’, ‘The Yung & Moore Show’). album(‘Yukio Yung’, ‘The Yung & Moore Show’). album(‘Jessie Ev

我是Prolog的乞丐,在这个练习中需要一些帮助,这是提供的知识库:

album(‘R. Stevie Moore’, ‘Manuscription’).   
album(‘Lane Steinberg’, ‘Manuscription’).  
album(‘R. Stevie Moore’, ‘The Yung & Moore Show’).  
album(‘Yukio Yung’, ‘The Yung & Moore Show’).  
album(‘Jessie Evans’, ‘Autonervous’).  
album(‘Bettina Koster’, ‘Autonervous’).  
album(‘Lucia Pamela’, ‘Walkin on the moon’).  
album(‘Shooby Taylor’, ‘The Human Horn’).  
album(‘Tiny Tim’, ‘God Bless Tiny Tim’).  
album(‘The Legendary Stardust Cowboy’, ‘Rock-It to Stardom’).  
vinil(‘Rock-It to Stardom’).  
vinil(‘Walking on the Moon’).  
cd( ‘God Bless Tiny Tim’).  
cd(‘Walking on the Moon’).  
cd(‘Autonervous’).  
cd(‘Manuscription’).  
cassette(‘The Human Horn’).  
cassette(‘The Yung & Moore Show’).  
mp3(‘Walkin on the Moon’).  
我需要进行一个查询,以返回仅由一位音乐家制作的所有专辑。

感谢您的帮助:)

在您提供的注释中,您的代码
相册(X,B),相册(Y,C),B\=C.
实际上,这离正确的解决方案并不遥远

正确的解决方案可以是:

one_musician_album(X) :-
    album(A, X), 
    \+ (album(B, X), A \= B).
谓词的含义是:如果专辑X是由某个音乐家a创作的,并且不可能找到另一个音乐家B创作了专辑X,那么专辑X就是“一个音乐家的专辑”

试运行:

?- one_musician_album(X).
X = 'Walkin on the moon' ;
X = 'The Human Horn' ;
X = 'God Bless Tiny Tim' ;
X = 'Rock-It to Stardom'.
要得到所有答案,你必须键入“;”在每个答案之后

也许您不需要这样做,但可以使用
findall
获得列表中的所有答案:

?- findall(X, one_musician_album(X), Albums).
Albums = ['Walkin on the moon', 'The Human Horn', 'God Bless Tiny Tim', 'Rock-It to Stardom'].

在您提供的注释中,您的代码
相册(X,B),相册(Y,C),B\=C.
实际上,这离正确的解决方案并不遥远

正确的解决方案可以是:

one_musician_album(X) :-
    album(A, X), 
    \+ (album(B, X), A \= B).
谓词的含义是:如果专辑X是由某个音乐家a创作的,并且不可能找到另一个音乐家B创作了专辑X,那么专辑X就是“一个音乐家的专辑”

试运行:

?- one_musician_album(X).
X = 'Walkin on the moon' ;
X = 'The Human Horn' ;
X = 'God Bless Tiny Tim' ;
X = 'Rock-It to Stardom'.
要得到所有答案,你必须键入“;”在每个答案之后

也许您不需要这样做,但可以使用
findall
获得列表中的所有答案:

?- findall(X, one_musician_album(X), Albums).
Albums = ['Walkin on the moon', 'The Human Horn', 'God Bless Tiny Tim', 'Rock-It to Stardom'].

这是一个基于内置的“所有解决方案”的概括

注意

?- bagof(A, album(A,T), As).
T = 'Autonervous',
As = ['Jessie Evans', 'Bettina Koster'] ;
T = 'God Bless Tiny Tim',
As = ['Tiny Tim'] 
....
然后,将authors(As)限制为单个元素的列表,我们将获得具有单个作者的相册

?- bagof(A, album(A,T), [A]).
A = 'Tiny Tim',
T = 'God Bless Tiny Tim' ;
...
然后,我们可以使用findall/3,如Sergey的正确答案,或者再次使用bagof/3,并进行明确量化:

?- bagof(T, A^bagof(A, album(A, T), [A]), Ts).
Ts = ['God Bless Tiny Tim', 'Rock-It to Stardom', 'The Human Horn', 'Walkin on the moon'].

这是一个基于内置的“所有解决方案”的概括

注意

?- bagof(A, album(A,T), As).
T = 'Autonervous',
As = ['Jessie Evans', 'Bettina Koster'] ;
T = 'God Bless Tiny Tim',
As = ['Tiny Tim'] 
....
然后,将authors(As)限制为单个元素的列表,我们将获得具有单个作者的相册

?- bagof(A, album(A,T), [A]).
A = 'Tiny Tim',
T = 'God Bless Tiny Tim' ;
...
然后,我们可以使用findall/3,如Sergey的正确答案,或者再次使用bagof/3,并进行明确量化:

?- bagof(T, A^bagof(A, album(A, T), [A]), Ts).
Ts = ['God Bless Tiny Tim', 'Rock-It to Stardom', 'The Human Horn', 'Walkin on the moon'].

您可能需要
findall/3
。试一试,让我们看看你的想法。老实说,我试过很多东西。正如我所说,我是一个初学者,我上周才开始学习prolog,所以我知道的不多。我还不知道如何使用
findall/3
命令,抱歉=/。我尝试过像专辑(X,B),专辑(Y,C),B\=C这样的东西,但显然没有用xD。你可以使用谷歌来查找有关
findall/3
的信息,例如:。此外,你必须从逻辑上思考问题<代码>相册(X,B),相册(Y,C),B\=C。表示,一个名为B的相册由X制作,一个名为B的相册由Y制作,其中B和C是不同的,这两个相册并不描述您所说的查询。想一想你在询问中想要什么。您可以询问:返回音乐家X制作的专辑(翻译成Prolog),然后使用
findall/3
获取所有专辑。然后检查获得的列表的长度是否为
1
。您可能需要
findall/3
。试一试,让我们看看你的想法。老实说,我试过很多东西。正如我所说,我是一个初学者,我上周才开始学习prolog,所以我知道的不多。我还不知道如何使用
findall/3
命令,抱歉=/。我尝试过像专辑(X,B),专辑(Y,C),B\=C这样的东西,但显然没有用xD。你可以使用谷歌来查找有关
findall/3
的信息,例如:。此外,你必须从逻辑上思考问题<代码>相册(X,B),相册(Y,C),B\=C。表示,一个名为B的相册由X制作,一个名为B的相册由Y制作,其中B和C是不同的,这两个相册并不描述您所说的查询。想一想你在询问中想要什么。您可以询问:返回音乐家X制作的专辑(翻译成Prolog),然后使用
findall/3
获取所有专辑。然后检查获得的列表的长度是否为
1