【问题标题】:Prolog GNU - Having a difficult time with this, lists and recursionProlog GNU - 在这方面遇到困难,列表和递归
【发布时间】:2010-10-25 01:01:44
【问题描述】:

所以,我仍然不完全理解 prolog 中的列表和递归是如何工作的,这可能是我遇到问题的原因,但我什至不知道如何开始这个问题。

有一个朋友列表。

f(a,b).
f(a,c).
f(a,d).
f(b,c).
f(b,e).
f(b,f).
f(c,e).
f(c,g).
f(g,e).
etc..

我必须通过最多两个朋友的朋友来确定某人是否是朋友。

如果我这样做的例子

fof(a,e, List).

那我应该得到

List = [a, b, e];
List = [a, c, e];
List = [a, c, g, e]; <-- anything past this point won't work

所以基本上你检查自己,然后看看你的朋友是否是 person2 的朋友,然后看看他们的朋友是否是 person2 的朋友,如果他们被添加到列表中。

虽然不完全确定如何执行此操作。

好的,所以我得到了与我需要的相似的东西。

fb(X,X,_).
fb(X,Y,List) :- 
    friend(X,Y),
    X \== Y,
    List = [X,Y].
fb(X,Y,List) :-
    friend(X,Z),friend(Z,Y),
    X \== Y, X \== Z, Z \== Y,
    List = [X,Z,Y].
fb(X,Y,List) :-
    friend(X,Z),friend(Z,Q),friend(Q,Y),
    X \== Y,X \== Z, X \== Q, Z \== Q, Z \== Y, Q \== Y,
    List = [X,Z,Q,Y].

这似乎可行,但似乎我可以用递归来压缩它,只是不确定如何。

【问题讨论】:

    标签: list recursion prolog


    【解决方案1】:

    如果f(X,Y)f(Y,X),我假设您已将friend(X,Y) 定义为真。

    您的问题可以通过添加一个指定允许的最大路径长度的参数递归解决,并在每次递归调用之前递减。

    fof(X,X,[X],_).
    fof(X,Z,[X|Path],N) :-
        N >= 1,
        friend(X,Y),
        M is N-1,
        fof(Y,Z,Path,M),
        \+ member(X,Path).  % no duplicates
    

    通过max联系朋友的朋友。两个中介,即分三步:

    ?- fof(a,e,L,3).
    L = [a, b, c, e] ;
    L = [a, b, e] ;
    L = [a, c, e] ;
    L = [a, c, g, e] ;
    L = [a, c, b, e] ;
    false.
    
    ?- fof(a,z,L,3).
    false.
    

    【讨论】:

    • 是的,对不起,f=朋友。我只是把它写成 f 以便更快地输入。
    • 这接近我需要的,我想我可以从这里得到它。我有一些接近的东西,没有 N 部分。叹息,序言,要么你做对了,要么你没有。不是我最喜欢的语言。
    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多