如何编写prolog规则?

如何编写prolog规则?,prolog,Prolog,我正在尝试创建一个prolog规则,它将使用S数分离度生成社交网络中的所有人 这是我制定的规则,但它只打印空列表。有人能帮我理解为什么会发生这种情况,以及我错在哪里吗 socialN(_,N):- N<1,!. socialN(_,N,_,_):- N<1,!. socialN(P1,Separation,S1,S):- (message(P1,P2,_); message(P2,P1,_)), D is Separation-1, \+(member(P2,

我正在尝试创建一个prolog规则,它将使用S数分离度生成社交网络中的所有人

这是我制定的规则,但它只打印空列表。有人能帮我理解为什么会发生这种情况,以及我错在哪里吗

socialN(_,N):- N<1,!.
socialN(_,N,_,_):- N<1,!.
socialN(P1,Separation,S1,S):-
    (message(P1,P2,_); message(P2,P1,_)),
    D is Separation-1,
    \+(member(P2,S1)),
    append(P2,S1,S2),socialN(P1,D,S2,S),!.
socialN(P2,Separation,S,S).

例如,Mark的网络仅包括1度分离的Martin;它包括马丁,史蒂夫和艾伦的2度分离;Martin、Steve、Allan和Jane参加了3场比赛。

我看到您正在使用
append
member
,所以我想您正在尝试建立一个人员列表。我有点惊讶,你没有使用
findall
。像这样:

allDirectLinks(P1, L) :- findall(P2, directlyLinked(P1, P2), L).

directlyLinked(P1, P1).
directlyLinked(P1, P2) :- message(P1, P2, _).
directlyLinked(P1, P2) :- message(P2, P1, _).
在此基础上,您可以编写递归函数来查找间接链接:

socialN(0, P, [P]) :- !.
socialN(N, P1, L3) :-
    N>0, !,
    N1 is N-1,
    socialN(N1, P1, L1)
    maplist(allDirectLinks, L1, L2),
    append(L2, L3).
例如,这将在Y中生成一个从Mark中分离出2步或更少的人员列表:

socialN(2, mark, X), list_to_set(X, Y).
请注意,标记本身包含在结果列表中(作为“0级”链接);我想事后过滤掉这一点不会太难

我希望这是有道理的;我有点生疏了,已经25年没做任何开场白了

编辑:我定义的规则解释:

  • 直接链接:如果两人之间有消息,则为true(无论消息的方向如何)
  • 所有直接链接:将与给定人员P1直接链接的所有人员累加到列表L中;只要看看芬德尔的手册就行了
  • 社交N:建立一个与给定人员(P)在小于或等于给定距离(N)的距离上连接的人员列表
    • 社会n(0,…):距离为0时,每个人都与自己联系在一起
    • socialN(N,…):进行递归调用以获取距离N-1处的连接列表,然后使用maplist将所有DirectLink应用于找到的每个连接,最后使用append将结果连接在一起

  • socialN/2
    谓词的含义或目的是什么?它代表社交网络……我刚刚把它称为socialNI,意思是
    socialN/2
    socialN/4
    的对比。你有一个有两个参数,其他的有4个。我试着把有两个参数的一个和有四个参数的一个链接起来,向用户展示他们不能插入0或更少的分离度,他们只能插入1或更多的分离度。然后,我尝试将一个带四个的链接到主规则,以显示我们试图查找/获取的内容
    append(P2,…)
    的结果将始终失败,因为
    P2
    不是一个列表。另外,注意
    D
    参数。请注意,如果要将一个元素
    P2
    预先挂起到列表
    S1
    ,只需说
    [P2 | S1]
    ,而不需要
    追加
    。你的谓词减去1,但是当它变为0时会发生什么?嗨,谢谢你的帮助。你能解释一下代码是如何工作的吗?我应该在查询中写些什么?再次感谢您当写在查询中时,答案如下所示:[1]7?-socialN(2,mark,X),list_to_set(X,Y)。X=[马克,马丁,马丁,史蒂夫,马克,艾伦],Y=[马克,马丁,史蒂夫,艾伦]。你能解释一下X是什么意思吗?因为我只需要为Y写的答案。你也能详细解释一下代码是如何工作的,这样我才能更好地理解它——你真是太好了。非常感谢你,一旦阿加尼知道这是你的头方式。此时您需要的是一个Prolog培训课程。万一你已经在做作业了:我真的不该做你的作业。@user3183631:哦,好吧;请看我的答案上面的编辑。
    socialN(2, mark, X), list_to_set(X, Y).