setof / 3内部的setof / 3不起作用,但是为什么呢?

问题描述 投票:1回答:1

灵感源于

Find mutual element in different facts in swi-prolog

我想尝试“ Prolog中的RDBMS操作”(实际上,或多或少是Datalog)

问题陈述

提供“电影中演员的数据库”:

starsin(a,bob).
starsin(c,bob).

starsin(a,maria).
starsin(b,maria).
starsin(c,maria).

starsin(a,george).
starsin(b,george).
starsin(c,george).
starsin(d,george).

给定一组电影,找到那些在上述所有电影中出演过的演员。

我首先有一个丑陋的解决方案,但随后...

很好的解决方案

澄清问题:

集合由没有重复的列表表示,可能有序。

  1. 给出电影组 MovIn
  2. ...查找演员组 ActOut
  3. ... ...这样:ActOut中的每个Actor都(至少)出现在MovIn中的所有电影中>
  4. ... ...重新格式化:MovAx的任何演员Ax电影集
  5. ActOutMovIn的超集。

setof/3似乎是正确的顶级谓词。点1和2的Ansatz

是:
setof(Ax, (... MovIn ...) , ActOut).

如果MovAxAx出现的电影集

,我们可以使用

第4点似乎使我们写作:

setof(Ax, (..., subset(MovAx, MovIn)) , ActOut).

开发... ...

setof(Ax, ( setof(Mx,starsin(Mx,Ax),MovAx) , subset(MovIn, MovAx) ) , ActOut).

这似乎已经!

[有λ表达式但有λ表达式时的感觉键盘上或语法中没有λ。

完成!

总结为谓词:

actors_appearing_in_movies(MovIn,ActOut) :-
   setof(Ax, ( setof(Mx,starsin(Mx,Ax),MovAx) , subset(MovIn, MovAx) ) , ActOut).

很遗憾,以上操作无效。

正在进行回溯,显然我需要将所有内容包装到另一个setof/3中,但为什么??

?- actors_appearing_in_movies([a,b],ActOut).
ActOut = [maria] ;
ActOut = [george].

完成,请两个

以下完成的工作:

subselect(Ax,MovIn) :- 
   setof(Mx,starsin(Mx,Ax),MovAx), subset(MovIn, MovAx).
actors_appearing_in_movies(MovIn,ActOut) :- 
   setof(Ax, subselect(Ax,MovIn) , ActOut).
?- actors_appearing_in_movies([a,b],ActOut).
ActOut = [george, maria].

测试中

测试仅在实现一些目标。

请注意,对于空的电影,我们会得到所有演员。这可以说是正确的:每个演员都在空旷的所有电影中担任主角。

actors_appearing_in_movies([],ActOut),permutation([bob, george, maria],ActOut),!. 
actors_appearing_in_movies([a],ActOut),permutation([bob, george, maria],ActOut),!.
actors_appearing_in_movies([a,b],ActOut),permutation([george, maria],ActOut),!.
actors_appearing_in_movies([a,b,c],ActOut),permutation([george, maria],ActOut),!.
actors_appearing_in_movies([a,b,c,d],ActOut),permutation([george],ActOut),!.

问题

我错过了什么

actors_appearing_in_movies(MovIn,ActOut) :-
   setof(Ax, ( setof(Mx,starsin(Mx,Ax),MovAx) , subset(MovIn, MovAx) ) , ActOut).

受到在swi-prolog中发现不同事实中的互惠元素的启发,我想尝试“ Prolog中的RDBMS操作”(实际上,这或多或少是Datalog)问题陈述给定数据库...

syntax prolog datalog prolog-setof
1个回答
1
投票
尝试:
© www.soinside.com 2019 - 2024. All rights reserved.