Ответ 1
вы можете "ссылаться" на альтернативные привязки на Y
следующим образом:
...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103).
Обратите внимание на скобки, необходимые для поддержания правильного потока управления выполнением. Оператор ;
/2 является общим or
. Для вашего ограниченного использования вы также можете выбрать более идиоматический
...registered(X, Y), member(Y, [ct101,ct102,ct103]).
что при обратном отслеживании Y привязывается к каждому члену списка.
изменить Я понял с задержкой ваше последнее требование. Если вы хотите, чтобы Y соответствовал всем 3 значениям или не подходит, используйте вместо этого
...registered(X, ct101), registered(X, ct102), registered(X, ct103).
или более компактный
...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]).
findall/3 создайте список в том же порядке, что и зарегистрированный /2. Затем я использую сортировку для обеспечения соответствия.
...setof(Y, registered(X, Y), [ct101,ct102,ct103]).
setof/3 также сортирует список результатов