灵感源于
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).
给定一组电影,找到那些在上述所有电影中出演过的演员。
我首先有一个丑陋的解决方案,但随后...
澄清问题:
集合由没有重复的列表表示,可能有序。
是:
- 给出电影组
MovIn
- ...查找演员组
ActOut
- ... ...这样:
ActOut
中的每个Actor都(至少)出现在MovIn
中的所有电影中>- ... ...重新格式化:
MovAx
的任何演员Ax
的电影集ActOut
是MovIn
的超集。setof/3似乎是正确的顶级谓词。点1和2的Ansatz
,我们可以使用setof(Ax, (... MovIn ...) , ActOut).
如果
MovAx
是Ax
出现的电影集
让我们使用subset/2
。
第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)问题陈述给定数据库...