我有大多数复合词,例如:
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).
我想搜索复合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).
请帮帮我
答案 0 :(得分: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)).
这是functor / 3文档。必要的内置是第2条,这是另一种简化的方法,使用univ构建'模板'头:
search_facts_by_arg(Functor, Arg, C) :-
C =.. [Functor,_,_],
clause(C, true),
once((arg(_, C, A), A == Arg)).
答案 1 :(得分: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)
你已经完成了。
你可以使用类似=的元谓词来避免改变你的理论。我个人认为这是错误的做法。最好从一开始就正确地解决问题。