Способ сделать синтаксис Пролог похож на синтаксис логики первого порядка? - PullRequest
0 голосов
/ 30 августа 2018

Я ищу способы, чтобы программа "Пролог" "выглядела" больше как логика первого порядка Вещи, которые я хотел бы иметь, например:

  • -> для импликации
  • антецедент слева от ->
  • ^ для соединения v для дизъюнкции

Или есть другое программное обеспечение, которое уже реализует это?

Заранее спасибо!

/ JC

Обновление 20190313 Я следовал предложениям в ответах ниже и попробовал это:

:- op(1200, xfx, ==>).
:- op(1000, xfy, /\).
:- op(1100, xfy, \/).

term_expansion(A ==> B, B:- A).
term_expansion(A /\ B, A, B).
term_expansion(A \/ B, A; B).

man(X) /\ unmarried(X) ==> bachelor(X).

man(john).
man(peter).
unmarried(john).

main:-bachelor(X), writeln(X), nl, fail.

Но я получаю следующую ошибку:

ERROR: bachelor/1: Undefined procedure: (/\)/2
   Exception: (5) man(_1740)/\unmarried(_1740) ? 

Только использование op / 3 и term_expansion / 3 для ==>, однако работает как положено. Не уверен, почему это так ...

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Используйте term_expansion / 2, который является макросом Пролога на SWI-Пролог:

% calc.pl
:- op(1200,xfx,--).
term_expansion(A--B,B:-A).

integer(I)
--%----------------------- (E-Int)
I => I.

E1=>I1, E2=>I2, I is I1+I2
--%----------------------- (E-Add)
E1+E2 => I.

:- 1+2+3=>6.
:- 1+2+3=>I,writeln(I).
:- halt.

и запустить

$ swipl calc.pl
6
0 голосов
/ 13 марта 2019

Этот ответ относится к вашему обновленному вопросу («Обновление 20190313»).

Будьте внимательны при определении операторов:

  1. Не переопределяйте стандартные операторы, меняя их спецификатор / приоритет.

    Это может привести к ошибкам в существующем коде, которые очень трудно найти.

  2. Взвесьте преимущества и расходы заранее.

    Нацеленность на удобочитаемость, более короткий код и меньшее количество скобок.

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

  3. Подумайте дважды, прежде чем использовать стандартные операторы в разных доменах.

    Давайте возьмем предопределенный (\/)/2 в качестве примера.

    • Это оцениваемый функтор в арифметических выражениях - используется с (is)/2, (=:=)/2, (<)/2 и т. Д.

    • clpfd использует его для представления множеств объединений, таких как 1..3 \/ 5..7 - отлично!

    • Однако использование его для обозначения конкатенации списков сомнительно.


Давайте перейдем к вашему актуальному вопросу!

Рассмотрим эти запросы, разлагающие некоторые термины с использованием (=..)/2 ("univ"):

?- term_expansion(A /\ B, A, B) =.. Xs.
Xs = [term_expansion, A/\B, A, B].

?- term_expansion(A \/ B, A; B) =.. Xs.
Xs = [term_expansion, A\/B, (A;B)].

Так что term_expansion/2 для (\/)/2, но term_expansion<b>/3</b> для (/\)/2!

Суть: (',')/2 условия в качестве аргументов требуют скобок.

?- term_expansion(A /\ B, <b>(</b>A,B<b>)</b>) =.. Xs.
Xs = [term_expansion, A/\B, (A,B)].
0 голосов
/ 30 августа 2018

Вот несколько символов Юникода, которые могут вам помочь:

<b>¬ 

→ ⇒

← ⇐

∨ ∧

∀ ∃
</b>

Я оставляю определение подходящих приоритетов как вызов, используя op/3.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...