View 事实视图,比如SQL视图?

View 事实视图,比如SQL视图?,view,prolog,functor,swi-prolog,View,Prolog,Functor,Swi Prolog,我有以不同格式存储的事实,例如: 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> 一般来说,最重要的是事实是一个三元组。。在未来,我可

我有以不同格式存储的事实,例如:

 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> 一般来说,最重要的是事实是一个三元组。。在未来,我可能会更改项目的可能结构,但我希望能够在三元组中使用简化视图。任何与此相关的想法都是受欢迎的

factview(fact(A, B, C)) :-
    fact(Af, Bf, Cf),
    functor(Af, A, _),
    functor(Bf, B, _),
    functor(Cf, C, _).
给予

给予


一种更通用的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.

一种更通用的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.

作为factview(A、B、cde)进行查询如何。。或者factview(A,gh,Z)…您可以从
factview
谓词中删除事实复合词,只需编写
factview(A,B,C)
,然后就可以进行查询。这就是你要问的吗?我明白了。。谢谢..让它成为factview(A,B,C):-…作为factview(A,B,cde)进行查询怎么样。。或者factview(A,gh,Z)…您可以从
factview
谓词中删除事实复合词,只需编写
factview(A,B,C)
,然后就可以进行查询。这就是你要问的吗?我明白了。。谢谢…就让它成为factview(A,B,C):-…这很好。可能需要使其动态化,并断言事实来查询它们。@rajashekar是的!您可以调用
assertz/1
,而不是
write/1
@rajashekar或者,您也可以通过将其作为谓词
view/2
的第二个参数添加(也可以通过删除对
forall/2
的调用)来获取
事实。这将是一个更好的解决方案,这很好。可能需要使其动态化,并断言事实来查询它们。@rajashekar是的!您可以调用
assertz/1
,而不是
write/1
@rajashekar或者,您也可以通过将其作为谓词
view/2
的第二个参数添加(也可以通过删除对
forall/2
的调用)来获取
事实。这将是一个更好的解决方案。词汇详细信息:“函子”->“函子名”。“函子”即“名称/算术”(根据ISO标准定义)。因此,您确实希望看到(函子或谓词或函数)标识符或名称词汇表的详细信息:“函子”-->“函子名称”。“函子”即“名称/算术”(根据ISO标准定义)。因此,您确实希望看到(函子、谓词或函数)标识符或名称