2012-11-17 38 views
1

让我有一个谓语p/1定义,例如,如下:如何获得可能的谓词的列表值

p(2). 
p(3). 
p(5). 
p(7). 

我如何定义一个谓词p_list/1这将是适用于所有可能的列表p/1(在上述情况下 - [2, 3, 5, 7])的值在回溯顺序?

这些值的简单枚举是不可接受的,因为这会使维护变得更加困难。而且值可以被隐含地定义。

回答

1

maplist/2行之有效的检查,而findall/3是在Prolog的基本列表构造

尝试

?- findall(X, p(X), L), maplist(p, L). 
+0

真的需要'maplist'调用吗? 'findall'似乎本身运作良好。 – citxx

2

您可以使用bagof(X, p(X), L)它给你L = [2,3,5,7]。 “隐含定义”是什么意思?你能给个例子吗。

+0

在最简单的情况下,可以有一个明确列举的谓词'缘/ 2'意味着图的边缘,并且谓词“顶点/ 1”意味着任何事物都出现在边上。可以在不更改谓词本身的定义的情况下更改“顶点”的值。 – citxx