【发布时间】:2017-12-30 09:49:01
【问题描述】:
我的部分作业有问题。我应该写一个谓词“友好”,当网络成员 X 被称为友好时,如果 X 喜欢所有喜欢他/她的人,这应该是真的。
编辑:在下面的示例中,barry 是友好的,因为喜欢 barry 的人的列表是 kara 并且 barry 喜欢 kara 回。卡拉不是正确的答案,因为喜欢卡拉的人名单是巴里、克拉克和奥利弗,但卡拉只喜欢巴里和克拉克,所以卡拉不友好。
例如 G = [person(kara, [barry, clark]),person(bruce, [clark, Oliver]),person(barry, [kara, Oliver]),person(clark, [oliver, kara] ),人(奥利弗, [kara])]
到目前为止我所拥有的;
friendly(G, X):-
member_(person(X, _), G),
likers(G, X, L),
likes_all(G, X, L).
% to get the list of members who like X;
likers(G, X, [Y|T]) :-
likes(G, Y, X),
select_(Y, G, G2),
likers(G2, X, T).
likers([], _, []).
likers([], _, _).
likers(_, _, []).
% select is used to remove the person from the list once visited.
select_(X, [person(X, _)|T], T).
select_(X, [H|T], [H|R]) :-
select_(X, T, R).
% to check whether X likes all the list of people that like X;
likes_all(G, X, [H|T]):-
likes(G, X, H),
likes_all(G, X, T).
likes_all(_, _, []).
likes_all(G, [H|T], X):-
likes(G, H, X),
likes_all(G, T, X).
likes_all(_, [],_).
likes(G, X, Y):-
member_(person(X, L), G),
member_(Y, L).
member_(X, [X|_]).
member_(X, [_|T]) :-
member_(X, T).
我的问题是它不能正常工作。请参阅下面的示例输出。
所以,我不知道出了什么问题以及我应该怎么做。我们不允许使用任何内置谓词或控制运算符,因此不能使用 !、;、=、\=、+ 等,只能使用纯序言。
感谢任何有关前进的提示。
输出:
[debug] ?- friendly([person(kara, [barry, clark]),person(bruce, [clark, oliver]),person(barry, [kara, oliver]),person(clark, [oliver, kara]),person(oliver, [kara])], X).
X = kara ;
X = kara ;
X = kara ;
X = kara ;
X = kara ;
X = bruce ;
X = barry ;
X = barry ;
X = clark ;
X = clark ;
X = oliver ;
false.
我认为我的错误出在 likers 函数的某个地方。 “likers”的输出:
?- likers([person(kara, [barry, clark]), person(bruce, [clark, oliver]), person(barry, [kara, oliver]), person(clark, [oliver, kara]), person(oliver, [kara])], kara, L).
L = [] ;
L = [barry] ;
L = [barry, clark] ;
L = [barry, clark, oliver] ;
L = [barry, oliver] ;
L = [barry, oliver, clark] ;
L = [clark] ;
L = [clark, barry] ;
L = [clark, barry, oliver] ;
L = [clark, oliver] ;
L = [clark, oliver, barry] ;
L = [oliver] ;
L = [oliver, barry] ;
L = [oliver, barry, clark] ;
L = [oliver, clark] ;
L = [oliver, clark, barry] ;
false.
在上面,正确的答案是 L = [barry, clark, Oliver] 或其中一种组合。有没有办法在纯序言中得到它?
【问题讨论】:
-
您能否发布更多输入数据来测试程序?另请注意,您发布的程序不起作用(
likes/3和member_/2不存在)。 -
1)
G代表什么?? 2) 为什么X应该friendly(G, X)为G = [person(alice,[bob]),person(bob,[])]成功?? -
对不起,我添加了缺少的代码并进行了一些编辑。
-
您是否可能误解了说明?
person/2子句可能应该在数据库中,而不是在列表中传递。 -
请发布代码,而不是图片。
标签: prolog