我的代码片段如下所示。在进行了大量繁琐的跟踪之后,我已经达到了一个点,我认为它是我问题根源的外部模块,因为findall
中的links_of_actor
永远不会被调用,但是links_of_actor
本身被调用。我非常感谢任何可以提供帮助的人,如果需要,我可以澄清/添加更多我的代码。
find_identity(A) :-
all_actor_links(ALs),
find_identity(ALs,[],A).
find_identity([a(A,_)],_,A).
find_identity(ALs,Ms,A) :-
agent_ask_oracle(oscar,o(1),link,L),
( memberchk(L,Ms) -> find_identity(ALs,Ms,A)
; otherwise -> purge_actors(ALs,L,NewALs),
find_identity(NewALs,[L|Ms],A)
).
links_of_actor(A,Ls) :-
actor(A),
wp(A,WT),
findall(L,wt_link(WT,L),Ls1),
findall(L,link(L),Ls2),
intersection(Ls1,Ls2,Ls).
actor_links(A,a(A,Ls)) :-
links_of_actor(A,Ls).
all_actor_links(ALs) :-
findall(A,actor(A),As),
maplist(actor_links,As,ALs).
-------------------------------------------- ---------支持功能--------------------------------------- ------------
% wp(Q,WT) <- issue query Q to Wikipedia and return the page in wikitext format
wp(Q,WT):-
wp_cache(Q,WT),!.
wp(Q,WT):-
wp_query2URL(Q,URL),
http_get(URL,R,[]),
atom_json_term(R,RR,[]),
wt_get(RR,WT0),
( atomic_list_concat1(_L,'#REDIRECT',WT0) -> wt_link(WT0,QQ),wp(QQ,WT)
; otherwise -> WT=WT0
),
assert(wp_cache(Q,WT)).
-------------------------------------------- ----------------编辑--------------------------------- -------------------------------
使用prolog提供的guitracer
后,我发现该程序在http_get(URL,R,[])
谓词的wp(Q,WT)
处失败。但是,我仍然不确定为什么这不起作用 - 可能是因为我的互联网?
为了澄清,谓词actor在我的文件中定义:actor('Billy Bob Thornton').
等等,链接也是如此:link('Barack Obama').
。
答案 0 :(得分:2)
那么,您是否尝试查看您提供给http_open
的网址是否真的有效?如果您http_open
可以使用以下网址,则可以随时从顶级进行测试:
?- use_module(library(http/http_client)). true. ?- http_open("stackoverflow.com", R, []). R = % a lot of stuff
答案 1 :(得分:2)
使用these definitions,可以通过在必须成功的目标前添加@
来对错误进行本地化。
...
wp(Q,WT):-
@wp_query2URL(Q,URL),
@http_get(URL,R,[]),
@atom_json_term(R,RR,[]),
@wt_get(RR,WT0),
...