List 序言:交朋友

List 序言:交朋友,list,prolog,List,Prolog,我要做的是,使用现有的好友(因此,使用friends2/1),获得mark的所有好友: ?-朋友(mark,X)。将给出此列表(注意他们出现的顺序): X=[sylvie,frank] 有人告诉我很多事情,我应该做 symmetric(..),retract(..),assert(..),fail. 但是从friends2/1将列表放回friends列表是行不通的。 有人能告诉我怎么做吗 这真的很重要 谢谢 编辑1: 这些都是一些试图让它发挥作用的尝试 :- use_module(library

我要做的是,使用现有的好友(因此,使用
friends2/1
),获得mark的所有好友:

?-朋友(mark,X)。
将给出此列表(注意他们出现的顺序):
X=[sylvie,frank]

有人告诉我很多事情,我应该做
symmetric(..),retract(..),assert(..),fail.

但是从
friends2/1
将列表放回friends列表是行不通的。 有人能告诉我怎么做吗

这真的很重要

谢谢

编辑1:

这些都是一些试图让它发挥作用的尝试

:- use_module(library(lists)).

friendof(mark, frank).
friendof(mark, sylvie).
friendof(john, sylvie).
friendof(marie, chris).


symmetrical(X, Y) :- friendof(X, Y).
symmetrical(X, Y) :- friendof(Y, X).

:- dynamic(friendlist/1).

friends(Friend, LL)  :-
   asserta(friendlist([])),
   friends2(Friend)
   retract(friendlist(LL)).
friends2(F) :-
也许你在做更复杂的事情

最重要的是:assert/retract不应用于计算数据库中的临时关系。使用它们只是为了改变知识——也就是说,结构良好且有意义的关系需要在课程期间保持不变

对于您的任务,请尝试

friends2(F) :- findall(B,symmetrical(A,B),B).
symmetrical(F,Y),retract(friendlis([Y:_])),assert(...
%symmetrical(..),retract(..),assert(..),fail.
当然,我不明白你为什么要做得这么复杂。。。也许你需要证明你能够修改数据库?我担心你会发现这样的问题(保持一致的db状态)比预想的困难得多,而学习断言/收回无用的关系对你没有多大帮助。无论如何

friends_of(Person, Friends) :-
  setof(Friend, (friendof(Person, Friend) ; friendof(Friend, Person)), Friends).

可以为您工作…

格式化代码是一件很好的事情。这会更容易阅读…谢谢!我一定会用的。
friendlis([Y:])
是什么意思?我正在尝试将Y值放入friendlist中。。。(哦,这是friendlist,我犯了一个错误,写了friendlis)。它不起作用,我只是显示我的进度,实际上不是进度……我必须使用friends和friends 2,所以你必须使用一个带有两个参数的
friends
谓词和一个带有一个参数的
friends 2
谓词?听起来像是一个糟糕而混乱的谓词名称选择。
friends(Friend, LL)  :-
   asserta(friendlist([])),
   friends2(Friend),
   retract(friendlist(LL)), !.

friends2(F) :-
   ( friendof(F, P) ; friendof(P, F) ),
   retract(friendlist(L)), 
   assert(friendlist([P|L])),
   fail.
friends2(_).