Книга: ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ
clause(X, Y)
clause(X, Y)
Выполнение целевого утверждения вида clause(X, Y) приводит к тому, что X и Y сопоставляются с заголовком и телом некоторого имеющегося в базе данных утверждения. При попытке выполнить указанное целевое утверждение переменная X должна быть до такой степени конкретизирована, чтобы был известен главный предикат утверждения. Если для данного предиката нет утверждений, то доказательство согласованности целевого утверждения заканчивается неудачей. Если имеется несколько утверждений, соответствующих предикату, то Пролог выбирает первое из них. В этом случае если предпринимается попытка вновь согласовать целевое утверждение, то будет выбрано следующее утверждение и так далее.
Заметим, что в то время как предикат clause всегда имеет аргумент, соответствующий телу утверждения, далеко не каждое утверждение действительно имеет тело. Если утверждение не имеет тела, то считается, что оно имеет фиктивное тело true. Мы называли такие утверждения «фактами». В той или иной степени конкретизируя X и Y, можно искать либо все утверждения, соответствующие данному предикату с вполне определенным числом аргументов, либо все утверждения, соответствующие некоторому образцу. Так, например:
присоединить([], X, X).
присоединить([А|В]),С,[А|D]:- присоединить(В,С,D).
?- clause(присоединить(А,В,С),Y).
А=[], В =_23, С=_23, Y = true;
А = [_23|_24], В =_25, С = [_23|_26], Y = присоединить(_24,_25,_26);
нет
Предикат clause очень полезен в том случае, если нам надо создать программы, анализирующие или исполняющие другие программы (см. разд. 7.13).
- Unconditional Execution
- Contextual Keywords
- Спаси и Повтори (Rescue и Retry)
- retract(X)
- 7.13. Применение предикатов clause и retract
- Access to the Shell
- Этап 6 - выделение множества дизъюнктов
- Regular Queries
- ГЛАВА 7. ЕЩЕ НЕСКОЛЬКО ПРИМЕРОВ ПРОГРАММ
- Looping Over Collections and Packages
- Putting It All Together