Nano Hash - криптовалюты, майнинг, программирование

Предикат Пролога (\=)/2 игнорируется

Начинаю работу с прологом, и я пытаюсь сделать несколько простых упражнений, однако довольно рано застрял... Я пытаюсь "сказать": майку нравятся все, если это мужчина или женщина, а не Майк. Но X \= mike, похоже, игнорируется:

man(mike).
man(danny).
man(samuel).
man(henry).

woman(samantha).
woman(jane).
woman(betty).
woman(jenny).

likes(mike, X) :-
    man(X);
    woman(X),
    X \= mike.

Майк появляется...

?- findall(X, likes(mike, X), L).
L = [mike, danny, samuel, henry, samantha, jane, betty, jenny].

Я предполагаю, что это потому, что пролог сначала оценивает правило man(X), поэтому Майку соответствует true. Однако, если я изменю его на:

likes(mike, X) :-
    X \= mike,
    man(X);
    woman(X).

Я возьму только женщин.

?- findall(X, likes(mike, X), L).
L = [samantha, jane, betty, jenny].

Вопрос как тогда это сделать? Спасибо!
Примечание. Я использую swi-prolog.

17.03.2016

  • Из-за приоритета оператора man(X); woman(X), X \= mike. интерпретируется как man(X) ; (woman(X), X \= mike).. Вы можете изменить это с помощью круглых скобок, чтобы сгруппировать ;: (man(X) ; woman(X)), X \= mike.. Это также одна из проблем с вашим вторым примером. См. информацию о приоритете операторов. 18.03.2016
  • Скажи listing(likes)! Он сразу показывает вам проблему. 18.03.2016
  • Название немного странное. На самом деле (\=)/2 — это не правило, а предикат. И этот предикат используется в литерале внутри правила. 20.03.2016

Ответы:


1

Проблема в приоритете оператора. Только в C/C#/Java/SQL и других процедурных языках в Прологе логическое ИЛИ (;) имеет другой приоритет, чем логическое И (',').

В большинстве процедурных языков такое выражение, как

A || B && C

Анализируется как

А || ( ДО НАШЕЙ ЭРЫ )

В Прологе выражение, подобное вашему

A ; B , C    

анализируется, как будто написано

A ; (B,C)

Так что ваши

likes(mike, X) :-
  man(X);
  woman(X),
  X \= mike.

по существу

likes(mike,X) :- man(X) ; ( woman(X) , X \= mike ) .

Вы утверждаете, что Майку нравятся все, кто

  • мужчина (включая себя), ИЛИ
  • женщина, которая не Майк.

Когда ты имеешь в виду, что Майк любит любого мужчину или женщину, кроме себя.

Итак... вам нужно сделать приоритет явным с помощью круглых скобок,

likes(A,B) :- ( man(B) ; woman(B) ) , A \= B .

или еще лучше, разбейте свой предикат на 2 предложения и сделайте его общим:

likes(A,B) :- man(B)   , A \= B .
likes(A,B) :- woman(B) , A \= B .

Улучшите ситуацию еще больше, сделав пол атрибутом объекта (человека), а не фактом сам по себе:

person( mike     , male ) .
person( danny    , male ) .
person( samuel   , male ) .
person( henry    , male ) .
person( samantha , female ) .
person( jane     , female ) .
person( betty    , female ) .
person( jenny    , female ) .

Тогда likes/2 еще проще, так как могут нравиться люди обоих полов:

likes(A,B) :- person(B,_) , A \= B .
18.03.2016

2

Проблема связана с оператором ИЛИ (;):

man(mike).
man(danny).
man(samuel).
man(henry).
woman(samantha).
woman(jane).
woman(betty).
woman(jenny).

Ваше решение:

likes(mike, X) :- (man(X);woman(X)),X\=mike.

Другим решением (с использованием эквивалента оператора ИЛИ) может быть:

likes(mike, X) :- man(X), X\=mike.
likes(mike, X) :- woman(X).

Обратите внимание, что вам не нужен оператор ИЛИ.

18.03.2016

3

Помимо проблемы ИЛИ есть еще одна проблема. Предикат (\=)/2 не является ограничением, что означает, что он не является полностью декларативным предикатом.

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

Предикат загружается из обычной унификации следующим образом:

X \= Y :- \+ X = Y.

Альтернативным определением может быть:

X \= X :- !, fail.
_ \= _.

Если вы действительно хотите иметь возможность обойти неравенство, вам следует взять систему Пролога с ограничениями, а затем прибегнуть к dif/2.

С dif/2 вы можете написать:

likes(mike, X) :-
    (dif(X, mike),
     man(X)
  ;  woman(X)).

Или следующее:

likes(mike, X) :-
    (man(X),
     dif(X, mike)
  ;  woman(X)).

И вы получите те же результаты. Это невозможно с (\=)/2.

Пока

P.S.: Причины проблем с (\=)/2. Отрицание как неудача \+ A иногда действует не только как ~A, но и как ~exists X1,..,Xn A. Заинтересованный читатель может захотеть просмотреть, по общему признанию, немного старое, но все еще применимое:

Теория доказательств логических программ с отрицанием
Роберт Штерк, Берн, 1992 г.
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.29.2745&rep=rep1&type=pdf

20.03.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..