我有一组Prolog事实,我试图查询,但我无法弄清楚如何统一更深层嵌套的变量。数据库中事实的一个例子如下:
character(super,mario, type(human)).
character(donkey,kong, type(ape)).
videogame(year(1991), console(nintendo), title([super,mario,bros]), characters([character(super,mario), character(princess,peach)])).
videogame(year(1999), console(nintendo), title([super,smash,bros]), characters([character(super,mario), character(donkey,kong)])).
例如,我想查询哪些字符出现在1个以上的视频游戏中。所以我知道我想要创建两个视频游戏实例,并确保在两个游戏中都出现相同的角色(按名称),并且这些游戏不是同一个游戏(按标题)。
因此我会做类似的事情:
?- videogame(_, _, title(Title1), characters(?????)), videogame(_, _, title(Title2), characters(?????)), not(Title1 == Title2).
然而,我的问题是找到一种方法在字符部分内创建变量,以便"首先"和"最后"字符名称与出现在多个视频游戏中的字符统一。
我尝试过以下几行(在完整查询中填写上面的问号)来尝试统一字符的名字和姓氏,但是它们会产生错误:
characters(character[First,Last])
characters([First, Last])
ERROR: Syntax error: Operator expected
我还尝试了以下内容,只返回false.
?- videogame(_, _, title(Title1), _), videogame(_, _, title(Title2), _), member(actor(First,Last,_), cast), not(Title1 == Title2).
我希望得到一些帮助,这样即使存在更多嵌套术语,我也可以更好地理解Prolog中的查询方式。
答案 0 :(得分:1)
来自库(列表)的intersection / 3我会写
?- videogame(_,_,title(Title1),characters(Cs1)), videogame(_,_,title(Title2),characters(Cs2)), Title1 @< Title2, intersection(Cs1,Cs2,Common).