序言:列出事实

时间:2018-11-13 22:29:38

标签: prolog

让我们说我正在寻找某人的朋友。

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).

最后结束我的搜索以找到[克里斯]

这可能吗?有没有更好甚至可能的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

链条条件

鉴于我正确理解,您想要生成一个与condpublic 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的结果),但我认为第一种方法更简洁更多自我解释:我们希望获得与L1findall/3F成为朋友的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中的元素。但是这里潜在的问题是,如果我们过滤掉第一个谓词的值,第二个谓词可能会产生很多结果,这是不可能的。

相关问题