1

我有大多数复合词,例如:

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).

我想搜索 Compound Tern,Atom 的值为“a”,另一个 Atom 的值为任意值。

Prolog 返回的结果:

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

请帮我

4

2 回答 2

1

我在这里写了一个通用的助手。我认为需要更少的内置函数......

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)).

呸...

测试:

?- 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 文档。基本的内置语句是 Clause/2,这里是另一种简化的方式,使用 univ 构建“模板”头:

search_facts_by_arg(Functor, Arg, C) :-
    C =.. [Functor,_,_],
    clause(C, true),
    once((arg(_, C, A), A == Arg)).
于 2013-01-24T10:15:08.737 回答
0

首先,您需要“具体化”谓词。你的理论变成:

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)

你完成了。

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

于 2013-01-24T09:32:35.047 回答