【问题标题】:Facts VIEW, like a SQL VIEW?Facts VIEW,像 SQL VIEW?
【发布时间】:2021-03-31 12:17:25
【问题描述】:

我有以不同格式存储的事实 f.e.:

 fact(a,b,c)
 fact(d,e,f(g,h))
 fact(j(k,l),m,n(o,p,q))
 ...

.. 总是三倍。 我想通过仅查看函子来创建事实视图,即

 fact(a,b,c)
 fact(d,e,f)
 fact(j,m,n)
 ...

你是怎么做到的..?

.. 当然我希望能够将它们作为普通事实进行查询...当然省略隐藏结构(考虑隐藏结构会很有趣,但现在不要让事情复杂化)

PS> 一般来说,最重要的是事实是三元组..将来我可能会改变项目的可能结构,但我希望能够在它是三元组的地方有简化的视图。欢迎任何类似这些方面的想法。

【问题讨论】:

  • 词汇细节:“函子”-->“函子名称”。 “函子”是"an identifier together with an arity",即“名称/数量”(根据 ISO 标准定义)。所以你真的想看到(函子或谓词或函数)identifiername

标签: view prolog functor swi-prolog


【解决方案1】:
factview(fact(A, B, C)) :-
    fact(Af, Bf, Cf),
    functor(Af, A, _),
    functor(Bf, B, _),
    functor(Cf, C, _).

给予

?- factview(X).
X = fact(a, b, c) ;
X = fact(d, e, f) ;
X = fact(j, m, n).

【讨论】:

  • 如何查询为 factview(A,B,cde) .. 或 factview(A,gh,Z) ....
  • 你可以把factview谓词中的事实复合去掉,写factview(A, B, C)就可以查询了。你问的是这个吗?
  • 我明白了.. 谢谢.. 让它成为 factview(A,B,C) :- ....
【解决方案2】:

更通用的 SWI-Prolog 方法:

fact(a,b,c).
fact(d,e,f(g,h)).
fact(j(k,l),m,n(o,p,q)).

view(Predicate/Arity) :-
    functor(Head, Predicate, Arity),
    forall( clause(Head, true),
            ( compound_name_arguments(Head, Predicate, Arguments),
              maplist([A,F]>>functor(A,F,_), Arguments, Functors),
              compound_name_arguments(Fact, Predicate, Functors),
              writeln(Fact) ) ).

查询:

?- view(fact/3).
fact(a,b,c)
fact(d,e,f)
fact(j,m,n)
true.

【讨论】:

  • 这很好。可能需要使其动态化,并断言事实以查询它们。
  • @rajashekar 是的!你可以打电话给assertz/1而不是write/1
  • @rajashekar 或者,您也可以通过将Fact 添加为谓词view/2 的第二个参数来获取Fact(也可以删除对forall/2 的调用)。
  • 是的,clause 回溯应该得到所有这些。那将是一个更好的解决方案。
猜你喜欢
  • 2015-09-04
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多