搜索在Prolog的一个原子(Search for a Atom in Prolog)

2019-08-08 02:14发布

我有大部分复合术语,如:

likes(a, b).
likes(c, b).
likes(a, d).
likes(b, c).
likes(c, a).
likes(a, f).
go(a, t).
go(t, d).
go(g, a).
go(f, g).
go(f, a).

我想搜索复合燕鸥,凌动的值是“A”,其他的Atom的价值是任何价值。

Prolog程序返回的结果:

likes(a, b).
likes(a, d).
likes(c, a).
likes(a, f).
go(a, t).
go(g, a).
go(f, a).

请帮我

Answer 1:

首先,你需要“具体化”的谓语的术语。 你的理论变成了:

do(likes, a, b).
do(likes, c, b).
do(likes, a, d).
do(likes, b, c).
do(likes, c, a).
do(likes, a, f).
do(go, a, t).
do(go, t, d).
do(go, g, a).
do(go, f, g).
do(go, f, a).

添加以下内容:

has_value(X) :- do(_, X, _)
has_value(X) :- do(_, _, X)

就大功告成了。

你可以使用元谓词像= ..避免改变你的理论。 我个人认为这是错误的做法。 最好是有从一开始就问题的正确形式化。



Answer 2:

我在这里写了一个通用的帮手。 我认为是需要更少的内建...

search_facts_by_arg(Functor, Arg, C) :-
    current_functor(Functor, Arity),
    Arity >= 2, % because of 'value of the other Atom is any value.'
    length(Args, Arity),
    C =.. [Functor|Args],
    clause(C, true),
    once((arg(_, C, A), A == Arg)).
  • current_functor (函子,元数)
  • 元数> = 2
  • 长度 (参数数量,元数)
  • Ç = .. [函子|参数]
  • 条款 (C,真)
  • 一次 (可赎回)
  • 精氨酸 (_,C,A)
  • 一个==精氨酸

呼...

测试:

?- search_facts_by_arg(go, a, C).
C = go(a, t) ;
C = go(g, a) ;
C = go(f, a) ;
false.

编辑 :@false”建议后,该代码可以简化

search_facts_by_arg(Functor, Arg, C) :-
    functor(C, Functor, 2),
    clause(C, true),
    once((arg(_, C, A), A == Arg)).

这里是仿函数 / 3文档。 基本内置的条款/ 2,这里的另一个简单的方式,利用大学建立了“模板”头:

search_facts_by_arg(Functor, Arg, C) :-
    C =.. [Functor,_,_],
    clause(C, true),
    once((arg(_, C, A), A == Arg)).


文章来源: Search for a Atom in Prolog
标签: prolog