Пролог жаргон: id (X, X). факт или правило? - PullRequest
3 голосов
/ 15 февраля 2020

В Прологе это однозначно факт:

foo(bar).

И это однозначно правило:

foo(X) :- bar(X).

Но как насчет предложения, которое имеет как не-одиночные переменные, так и нет: - например,

identity(X,X).

или более реалистично что-то вроде

my_member(X, [X|_]).

Я вызывал эти правила с тех пор, как изучил Пролог, но теперь, когда я попытался проверить будь уверен на 100%, я не могу найти какой-либо источник, отличающий меня от первых двух примеров.

Таково правило:

  • предложение который определяет переменные логические отношения, то есть предложение, которое не всегда будет успешным.
  • предложение, которое определяет отношение между предикатами (или, возможно, предикатом и самим собой).

Ответы [ 2 ]

4 голосов
/ 16 февраля 2020

Иногда сама терминология вызывает проблемы, которых в реальных системах Prolog нет вообще. В общей терминологии, а также в стандартной терминологии, identity(X,X). и my_member(X, [X|_]). являются фактами. Тем не менее, лучше использовать предложение, когда это кажется подходящим.

Беспокойство проистекает из набора решений, которые подразумеваются в таких случаях. На самом деле, существует бесконечное количество решений для обоих примеров. В противном случае основные факты просто описывают одно решение каждый. Придерживаясь только основополагающих фактов, упрощается восходящая интерпретация.

Так что насчет пункта a :- true. Это факт или правило? Он использует правило-атом. но это тело верно. Примечание в 3.72 исключает (:-)/2 в качестве основного функтора фактов. Что ж, все это является четким признаком того, что терминология здесь слишком мелкозернистая.

Итак, придерживайтесь как можно большего количества пунктов.

1 голос
/ 16 февраля 2020

Правда в том, что есть спор по терминологии Пролога, но я попытаюсь сделать краткий обзор, который, мы надеемся, приведет к некоторым ответам.

Вообще говоря, программа Пролога состоит из объекты и отношения между ними.

Отношения называются предикатами , а объекты называются аргументами предиката. Количество аргументов - это предикат arity .

Описание объектов и их отношений выполняется с помощью кеши . Есть три типа предложений: факты, правила и запросы.

A fact обозначает отношение между объектами. Это соотношение однозначно верно. Синтаксически факт состоит из имени, описывающего отношение, за которым следуют один или несколько разделенных запятыми объектов в скобках и точка. Пример:

male(john).
father_of(adam, cain).

Объединяя факты, мы можем определить новые отношения между объектами. Это делается с помощью правила , которое состоит из двух частей: раздела условий (также называемого телом правила) и заключения (также называемого главой правила). В то время как факты обозначают отношения, которые однозначно истинны, правила обозначают отношения, которые являются истинными, только если выполняются определенные условия. Эти условия также являются отношениями между объектами. Синтаксически глава правила отделяется от тела оператором шеи (:-), который можно прочитать как , если . Условия правила, если их больше одного, разделяются запятыми, которые можно читать как и . Пример:

father_of(X,Y) :-
    parent(X,Y),
    male(X).

В заключение, правила и факты являются оговорками. Правило имеет форму Head :- Body., а факт имеет форму Head. Предикаты - это отношения, определяемые именем и числом аргументов, и для одного и того же предиката может быть несколько фактов или правил. В конечном итоге:

Father_of / 2 - это предикат с именем Father_of с арностью 2

Father_of (Адам, Каин). - это факт

папа (Адам, Авель). - это еще один факт

Father_of (A, B): - родитель (A, B), мужчина (A). - это правило

...