在序言中比较多个事实的值

时间:2018-10-19 17:21:11

标签: prolog

$args = array(
    'post_type' => 'post',
        'relation' => 'OR',
        array(
            'post__in' => $post_array,
        ),
        array(
            'category__in' => $category_array,
        ),
);

我的查询是:谁住在同一个城市?我写了一条规则,知道它不适用于该查询,但无法为该查询制定任何准确的规则。

1 个答案:

答案 0 :(得分:1)

我给你一个开始的过程。

由于您可能对“居住在同一城市中的所有名称”有多种解决方案(因为对于多个城市来说可能都是这样),所以我建议编写以下形式的谓词:

same_city(City, NameList).

现在,您可以集中精力编写谓词,因为参数由单个City组成,并将提供一个或多个名称的列表:

same_city(City, NameList) :-
    findall(Name, workers(...), NameList)).

我将留给您填写...

现在,这将为您提供在给定城市中甚至只有一个名字的解决方案。如果只希望对至少两个名称的城市成功,则需要指定该条件:

at_least_two_same_city(City, NameList) :-
    findall(Name, workers(...), NameList)),
    length(NameList, NumberOfNames),
    NumberOfNames > 1.

确保长度大于1的列表的另一种方法是将[_,_|_]的形式用于列表,这使方法更整洁:

at_least_two_same_city(City, NameList) :-
    NameList = [_,_|_],   % We only want lists with at least 2 members
    findall(Name, workers(...), NameList)).

最后,如果您想要该谓词的所有解决方案,则可以在该谓词上再次使用findall/3

findall(City-NameList, at_least_two_same_city(City, NameList), AllMultipleNameCitiesAndNames).