【发布时间】:2016-03-08 06:54:16
【问题描述】:
基本上,我的知识库中有一系列关于流行歌星及其最成功岁月的事实(见下文)。
popStar('Jackson',1987,1991).
popStar('Jackson',1992,1996).
popStar('Michaels',1996,2000).
popStar('Newcastle',2000,2007).
popStar('Bowie',2008,2010).
我需要创建一个谓词,该谓词采用单个参数,如果 popStar 的名称被识别,则该参数为 true,如果使用变量代替,它将产生回溯,没有任何重复。最初我从一些非常简单的东西开始(见下文)。
ispopStar ().
ispopStar (H) :- popStar (H,_,_).
但后来发现任何回溯都会包含重复项(“杰克逊”提到了两次)。因此,希望使用 findall/3 创建一个列表,然后使用 member 检查 popStar 是否有效。
但是,每当我尝试在我根据事实创建的列表上使用成员谓词时,它总是会导致一个不停的、不断扩展的列表。我认为这很可能是一个菜鸟错误,因为我才刚刚开始学习序言。如果有人可以查看我下面的代码并可以看到我做错了什么,我将不胜感激。
谢谢。
Findall/3
findall(V,popStar(V,B,N),X)
结果
X = ['Jackson', 'Jackson', 'Michaels', 'Newcastle', 'Bowie']
会员/2
member('Newcastle',X).
结果
339 ?- member('Newcastle',X).
X = ['Newcastle'|_G2881] ;
X = [_G2880, 'Newcastle'|_G2884] ;
X = [_G2880, _G2883, 'Newcastle'|_G2887] ;
X = [_G2880, _G2883, _G2886, 'Newcastle'|_G2890] ;
X = [_G2880, _G2883, _G2886, _G2889, 'Newcastle'|_G2893]
更新
我玩过,但仍然很卡。我正在使用下面的谓词来创建唯一条目列表;
setof(Name,X^Y^popStar(Name),Names)
然后使用下面的谓词来判断一个元素的存在(下面的例子)。
setof(Name,popStar(Name),Names), member('Jackson',Names).
从上面的谓词,它返回一个值;
Names = ['Jackson'].
但实际上,我希望它返回 true,因为“成员”证明特定元素是否在列表中。此外,当我尝试将变量插入成员时(以便它回溯所有可用的 popStars,我收到以下消息)。
setof(Name,popStar(Name),Names), member(X,Names).
Names = ['$VAR'('X')].
非常感谢通过向我展示在此示例中的操作来提供帮助。我真的被卡住了,所以真的很感激。
【问题讨论】:
-
setof(Name,popStar(Name),Names), member('Jackson',Names).将会成功(你称之为“返回真”)并向你展示它为变量Names得出的结果。这就是它的工作原理。您能否解释一下您的意思,当我尝试将变量插入到成员中时,以及您想要实现的目标是什么?
标签: prolog