Предикат p/1
использует встроенный предикат (is)/2
.Обратите внимание, что X is 5
является синтаксически более удобным способом написания is(X,5)
.Но ваш мета-интерпретатор ожидает только определенные пользователем предикаты и управляющие конструкции (',')/2
и true/0
.Если вы хотите обработать (is)/2
, вы должны ввести для него отдельное предложение.
sol(X is Y) :- !, X is Y.
В рамках ISO Prolog цель predicate_property(Goal,built_in)
может использоваться для проверки, является ли Goal
встроеннымсказуемое.Это работает во многих системах, таких как B, GNU, SICStus, SWI, XSB, YAP.Таким образом, вы можете написать:
sol(Bip) :- predicate_property(Bip, built_in), !, Bip.
В ECLiPSe эта встроенная функция не доступна напрямую.Вы должны загрузить библиотеку.Индекс руководства предлагает использовать библиотеку swi
или quintus
.По какой-то (неясной) причине он не является частью библиотеки ECLiPSe iso
, но все же является ISO.Поэтому сначала укажите в своем файле (или на верхнем уровне)
:- use_module(library(swi)).
.
Если вы хотите, чтобы мета-интерпретатор охватывал весь язык Prolog, вам придется явно обрабатывать все управляющие конструкции,Вот они - как определено в стандарте (7.8 Управляющие конструкции).
true/0
fail/0
call/1
!/0
(',')/2
(;)/2
- дизъюнкция (->)/2
(;)/2
- if-then-else catch/3
throw/1
Помните, что только некоторые из них могут быть обработаны путем прямого вызова цели.Большинство из них должны быть обработаны явно!