Булево назначение в Прологе
Все.
Я хочу присвоить логическое значение переменной.
Я пробовал такие вещи, как.
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).