Установка в поиске

У меня есть правило:

best_fit(Team, Enemies, Result, List) :-
    findall((H, E), score(H, Enemies, Team, E), List),

где определение оценки:

score(Hero, Enemies, Team, Result) :- 
   hero(Hero),
...

Я хотел бы найти только тот (H, E), где H не находится ни в Enemies, ни в Team. Я попытался позже exclude, но результаты - это кортежи, и заставить их работать довольно сложно. Есть ли способ отфильтровать его в методе findall? Как я могу подойти к этому?


person Marcin Majewski    schedule 13.11.2019    source источник


Ответы (1)


Вы можете применить это в цели:

best_fit(Team, Enemies, Result, List) :-
    findall((H, E), (
        score(H, Enemies, Team, E),
        \+ member(H, Enemies),
        \+ member(H, Team),
    ), List).

Итак, здесь мы изменили цель таким образом, чтобы она удовлетворялась, если score(H, Enemies, Team, E) и H не является членом Enemies, а H не является членом Team.

person Willem Van Onsem    schedule 13.11.2019
comment
Большое спасибо, намного чище, чем исключение и т. д. Я пытался сделать это так, но что-то было не так, во всяком случае, теперь это работает! - person Marcin Majewski; 13.11.2019