让我们说我正在寻找某人的朋友。
friend(mary, peter).
friend(mary, paul).
friend(mary, john).
friend(mary, justin).
friend(chris, peter).
friend(chris, paul).
friend(chris, conner).
friend(chris, louis).
friend(tyler, justin).
friend(tyler, lindsey).
friend(tyler, frank).
friend(tyler, paul).
friend(dan, justin).
friend(dan, conner).
friend(dan, frank).
friend(dan, peter).
在上面的示例中,我知道我可以做类似的事情
friend(X, paul).
这将告诉我每个保罗都是朋友
或者也是
findall(X, friend(X, paul), L).
这将返回保罗与之成为朋友的每个人的列表。
比方说,我想在搜索中做得更深一些,并对它进行优化。所以说我要做的事
findall(X, friend(X, paul), A).
让A成为[玛丽,克里斯,泰勒]的清单。但是后来我想进一步完善搜索范围。我希望能够将列表放入类似这样的函数中(我知道这是无效的,但这是我想做的事情的思想模式)
findall(A, friend(A, peter), B).
这次只想找回[玛丽,克里斯]。然后甚至进一步完善它以说
findall(B, friend(B, conner), C).
最后结束我的搜索以找到[克里斯]
这可能吗?有没有更好甚至可能的方法可以做到这一点?
答案 0 :(得分:1)
鉴于我正确理解,您想要生成一个与cond
,public static void main(String[] args)
{
Thread t1 = new Thread()
{
@Override
public void run()
{
ServerOneClass.main(whateverArgsItNeeds);
}
};
t1.start();
Thread t2 = new Thread()
{
@Override
public void run()
{
ClientOneClass.main(whateverArgsItNeeds);
}
};
t2.start();
//and so on.
//The order is enforced by the order you call start(), not the order in which you declare the threads
}
和paul
成为朋友的人的列表。我们可以通过“构建”旨在满足以下三个条件的目标来做到这一点:
peter
或其他条件组合。然后给出:
connor
findall(F, (friend(F, paul), friend(F, peter), friend(F, conner)), L).
过滤现有列表或者我们也可以使用两个调用,并使用?- findall(F, (friend(F, paul)), L).
L = [mary, chris, tyler].
?- findall(F, (friend(F, paul), friend(F, peter)), L).
L = [mary, chris].
?- findall(F, (friend(F, paul), friend(F, peter), friend(F, conner)), L).
L = [chris].
来“模拟”像这样的交集:
member/2
在这里,我们因此使用member/2
使得findall(F, friend(F, paul), L1),
findall(F, (member(F, L1), friend(F, peter)), L2).
仅从member/2
中取值(初始F2
的结果),但我认为第一种方法更简洁更多自我解释:我们希望获得与L1
,findall/3
和F
成为朋友的paul
的列表。
peter
来获得与列表中的所有人成为朋友的人我们还可以通过使用conner
在此处找到与好友列表在一起的人:
maplist/2
我们还可以进行两个单独的maplist/2
调用,然后计算交集:
findall(F, maplist(friend(F), [paul, peter, conner]), L).
因此,findall/3
将包含findall(F, friend(F, paul), L1),
findall(F, friend(F, paul), L2),
intersection(L1, L2, M).
和M
中的元素。但是这里潜在的问题是,如果我们过滤掉第一个谓词的值,第二个谓词可能会产生很多结果,这是不可能的。