предотвращение возврата без среза - PullRequest
0 голосов
/ 08 октября 2018

Довольно плохо знаком с прологом и пытаюсь решить некоторые упражнения.Имея базу знаний о компонентах

component(ElementX,ElementY,Qty).
ElementX uses ElementY in it's structure in quantity Qty.

component(car, door, 4).
component(car, wheel, 4).
component(wheel, tire, 1).

Я хочу найти каждый ElementX, который не является ElementY одновременно.

Это ожидаемый результат

?-final_product(X). 
X = car; 
false. 

Что заставляет меня верить, что я не могу использовать разрез, так как я получаю это

?-final_product(X). 
X = car.

, и если я не предотвращаю возврат, все, что я получаю, это

?-final_product(X). 
X = car; 
X = car; 
false. 

Как именноя достиг бы ожидаемого результата?

РЕДАКТИРОВАТЬ:

final_product(X):-
  setof(X, (component(X, _, _), \+component(_, X, _)), Results),
  member(X, Results).
...