Что означает предикат простой / 1 в Прологе (SWI-Prolog)

Я столкнулся с проблемой при чтении книги. Я вижу, что программа использует предикат "простой" (я думаю, simple/1). Я не знаю, что означает этот предикат, я не могу найти его с ?-help(simple) в консоли. Но когда я попытался выполнить несколько запросов в консоли, это сработало примерно так:

5 ?- simple(p(x)).
false.

6 ?- simple(mia).
true.

7 ?- simple(Mia).
true.

8 ?- simple(f(Mia)).
false.

Я предполагаю, что это своего рода предикат, чтобы определить, был ли аргумент терминами (или переменными) или сложными терминами.


person toantran    schedule 28.01.2012    source источник


Ответы (2)


В руководстве по swi-prolog есть следующее определение:

simple (@Term) - это полудет. Термин является атомарным или переменным.

определение находится в библиотеке совместимости пролога quintus; в документации по прологу quintus определение:

простой (+ Срок)

В настоящее время термин создается для атома, числа, базы данных или переменной.

в любом случае, simple / 1 истинно, если аргумент является простым термином (не уверен, что руководства quintus подразумевают под базой данных; возможно, это обработчик для соединения ODBC, я думаю)

person Thanos Tintinidis    schedule 28.01.2012

переведено в предикаты ISO:

simple(T) :- var(T) ; atomic(T).

var / 1 - это наиболее простое средство метапрограммирования, поскольку невозможно предикатировать (т.е. выполнить код, привязку переменных) к любому предложению без создания экземпляров переменных, которые во много раз превышают существенная часть, в которой мы заинтересованы.

person CapelliC    schedule 28.01.2012
comment
В качестве общего замечания - определение типа simple/1 не очень полезно, потому что оно объединяет два уровня тестирования в один предикат. - person false; 17.02.2012
comment
@false: вы имеете в виду, что дизъюнкция вводит бесполезную точку выбора? Я не знаю, что такое «уровни тестирования» ... - person CapelliC; 17.02.2012
comment
Когда вы пишете предикаты, которые явно зависят от экземпляра аргумента, рекомендуется отделить тестирование экземпляров var(X), nonvar(X) от другого тестирования. В частности, рекомендуется рассматривать оба случая явно. В противном случае будет довольно сложно рассуждать о предикате. simple/1 смешивает оба уровня. И, кстати. также atom/1, integer/1 и т. д. делают это. Но они менее проблематичны, если вы сделаете _6 _ / _ 7_ тест раньше. - person false; 17.02.2012