Булево назначение в Прологе - PullRequest
3 голосов
/ 28 сентября 2011

все.

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

Я пробовал что-то вроде.

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

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

Какие-нибудь решения?

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

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

Кроме того, пролог не имеет логического значениятип.Встроенные типы Prolog:

  • целое число
  • float
  • atom
  • несвязанная переменная
  • составной член

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

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

3 голосов
/ 29 сентября 2011

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

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

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

use_module(library(clpfd)).

diag(XPiece, XFinal, Diagonal) :-
    Diagonal #= (XPiece #= XFinal).
1 голос
/ 28 сентября 2011

А как же

diagonal(XPiece, XFinal) :- XPiece = XFinal.
...