Синтаксис Пролога для зависимых условий

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

В данном случае я хочу определить приемных родителей (в частности, мачеху и отчима). Мой текущий синтаксис таков:

isStepFather(X, Y):-
    dif (X, Y),
    isMale(X),
    not(isParent(X, Y)),
    isMother(Z, Y), isHusband(X, Z).

Во-первых, я знаю, что иногда «не» — это «\=" или какая-то другая комбинация косых черт, так есть ли лучшая версия моего утверждения «не»? Кроме того, последняя строка должна выглядеть так: «X — отчим Y, если Z — мать Y, а X — муж Z».

Я хочу указать два Z-утверждения как одну идею/условие, поэтому помещаю их в одну строку, но имеет ли это значение? Или есть лучший способ объединить два условия, которые связаны друг с другом, но не обязательно с другими условиями?

Наконец, было бы лучше/элегантнее использовать isWife(Z, X) вместо isHusband(X, Z) чтобы Z стоял перед обоими утверждениями?

Пожалуйста, дайте мне знать ваш отзыв!

Вы усложняете свою жизнь, используя имена переменных X, Y и Z, а не осмысленные имена, такие как Мать, Отец, Дитя.

brebs 03.08.2024 00:44

Я понимаю, что это легко происходит в более сложном коде, но мне хотелось подумать об этом абстрактно. Например, было бы легко сказать is_father(Отец, Сын):- dif (Отец, Сын), is_male(Отец), is_male(Сын). Но если абстрактно выразить это, например, X, Y, Z, то это заставляет меня задуматься: «Что именно делает любого данного человека отцом любого данного другого человека?» Например, «Сын» на самом деле может быть дочерью.

Hayato 05.08.2024 15:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На ум приходят 2 разумных способа:

stepfather_child(SF, C) :-
    mother_child(M, C),
    husband_wife(SF, M),
    \+ father_child(SF, C).

... и:

stepfather_child_alt(SF, C) :-
    dif (F, SF),
    mother_father_child(M, F, C),
    husband_wife(SF, M).

Некоторые примечания по программированию:

  • Значимые имена переменных гораздо полезнее, чем бессмысленные имена.
  • \+ безопасно только тогда, когда переменные заземлены, поэтому переместите его после предложений, которые сделают переменные заземленными
  • Чтобы немного повысить производительность, переместите предложения dif до того, как их можно будет вызывать бессмысленно — часто из-за возврата
  • Имена предикатов, описывающие их аргументы, очень элегантны и удобны, особенно учитывая реляционную природу Пролога.
  • Классификация – это форма искусства, например. зачем иметь parent или person, а затем нужен какой-то другой способ узнать что-то столь же фундаментальное, как мужчина или женщина, когда, например, husband_wife или mother_father_child делает это очевидным по их расположению - можно сделать это более конкретным, например. mother_father_daughter и mother_father_son
  • Кажется, немного удобнее читать имена предикатов like_this, а не likeThis, чтобы выделялись переменные, написанные с заглавной буквы.

(1) Идея isMale/isFemale заключалась в том, чтобы снова защитить результаты поиска, возвращающие результаты неправильного пола, точно так же, как функция dif () защищает от того, чтобы человек был их собственным родителем/ребенком/братом. (2) Я планирую использовать Пролог в качестве логической машины в будущих приложениях (среди прочих я родом из C++), поэтому такие имена, как mother_father_son(M, F, S), сбивают с толку чтение, когда я хочу проверить, является ли женщина матерью. любых детей. Отсюда мой синтаксис с isMother. Qt и C# часто используют этот синтаксис, плюс мне легче читать как isMother(sandra, Child) -> true = Sandra — мать некоторого ребенка.

Hayato 05.08.2024 15:17

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

brebs 05.08.2024 17:55

Как обычно, самая сложная часть изучения нового языка — это перенастроить ваш мозг на мышление в стиле этого языка. Я буду иметь это в виду в дальнейшем.

Hayato 05.08.2024 21:13

Другие вопросы по теме