使用findall并附加

时间:2014-01-04 22:46:33

标签: prolog

我被困住了。有人可以告诉我我的谓词中有什么错误吗?

sizeNet([H|T],L,user,_):-
    findall( Y, fullfriend(H,Y,L,user), LR),
    append( L, LR, LF),
    sizeNet (T, LF, user, LF).

sizeNet([],_,_,_).

fullfriend(userH,Y,L,user):-
    (
     relation(Utilizador,Y)
    ;
     relation(Y,userH)
    ),
    \+member(Y,L),
    Y \== user.

如果我写

?-sizeNet([jon,soldado],[jon,soldado],jony,LF).

我的LF是空的但是如果我调试,在结束之前谓词LF具有我需要的所有信息,但最后所有信息都消失了。如何停止递归并返回LF的信息?

1 个答案:

答案 0 :(得分:1)

您的代码有几个问题,但在到达列表末尾时已经正确停止了递归。

为了正确构建并向调用者报告LF,我建议

sizeNet([H|T],L,user,LTot):-
    findall(Y, fullfriend(H,Y,L,user), LR),
    append(L, LR, LF),
    sizeNet(T, LF, user, LTot).
sizeNet([],L,_,L).

注意:sizeNet (T, LF, user, LF).在大多数Prolog中是语法错误 - 仿函数和参数列表之间不允许空格'左括号