Булево назначение в Прологе

Все.

Я хочу присвоить логическое значение переменной.

Я пробовал такие вещи, как.

Diagonal is (XPiece = XFinal)
Diagonal is (XPiece =:= XFinal)
Diagonal is (XPiece is XFinal)

Нет работы...

Какие-либо решения?

3 ответа

Решение

Встроенный предикат Пролога is/2 оценивает правую часть выражения как арифметическое выражение и объединяет результат с левой частью.

Кроме того, пролог не имеет логического типа. Встроенные типы Пролога

  • целое число
  • поплавок
  • атом
  • несвязанная переменная
  • сложный термин

Вы можете выбрать для представления логического значения в качестве атомов true/false (полезно для читабельности), или вы можете представить логическое значение в виде целочисленных значений 1/0 (полезно для вычислений). Способ, которым большинство процедурных языков, таких как C, оценивает арифметические значения как логические значения, является нарушением формальной логики WRT: ложность однозначна (0) и истинно многозначна (ненулевая), что означает то, что не является ложным. В формальной логике истина однозначна, а ложь определяется как неправда.

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

Используйте if-then-else:

(XPiece = XFinal ->
    Diagonal = true
;
    Diagonal = false
)

или использовать 1/0или что хочешь. В качестве альтернативы используйте CLP(FD), который поддерживает идиому, которую вы хотите:

use_module(library(clpfd)).

diag(XPiece, XFinal, Diagonal) :-
    Diagonal #= (XPiece #= XFinal).

Как насчет

diagonal(XPiece, XFinal) :- XPiece = XFinal.
Другие вопросы по тегам