我不确定为什么&find'identity(X)'返回为假[下面的代码]

时间:2015-06-17 19:40:14

标签: prolog

我的代码片段如下所示。在进行了大量繁琐的跟踪之后,我已经达到了一个点,我认为它是我问题根源的外部模块,因为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').

2 个答案:

答案 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),
    ...