Prolog "или" оператор, запрос

Я работаю над прологом, для которого я новичок.

Я ищу оператора "или"

registered(X, Y), Y=ct101, Y=ct102, Y=ct103.

Вот мой запрос. Я хочу написать код, который будет:

"return X, учитывая, что Y равно значению Z OR value Q OR value P"

Я прошу вернуть X, если Y равно всем 3. Что это за оператор? Есть ли это?

Ответы

Ответ 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 также сортирует список результатов

Ответ 2

Еще одна точка зрения. Выполнение "или" в Prolog также может выполняться с помощью оператора "disjunct" или с запятой:

registered(X, Y) :-
    X = ct101; X = ct102; X = ct103.

Для более полного объяснения:

Предикатный контроль в Prolog