Пролог реализации и /2, или /2, nand/2, ни /2, xor/2
Я хочу реализовать следующие предикаты в прологе и использовать их для таблиц истинности: и /2, или /2, nand/2, ни /2, xor/2
Может быть, кто-то может показать мне, как реализовать и /2, например, чтобы я мог сделать другие сам и опубликовать их здесь.
2 ответа
Осторожно: вы, вероятно, имеете в виду and/3
, вместо and/2
, AND - это троичный предикат, определяющий отношение между 3 значениями истинности, а не 2. Конечно, вместо того, чтобы приводить в соответствие (= делать вещи явными), вы можете использовать встроенный механизм Prolog, где значение истинности неявно. Но для начала я бы начал с троичного отношения, поскольку это делает все значения истинности явными и позволяет также спросить, например: "Какие значения истинности дают false
для данной операции?"Для начала, одна запись для таблицы истинности and/3
где я использую атом true
для обозначения логического значения true:
and(true, true, true).
Независимо от этого также рассмотрите возможность использования логических ограничений, которые, например, доступны в SICStus Prolog и GNU Prolog, и позволяют декларативно выражать отношения между значениями истинности и логическими выражениями.
Пример использования library(clpb)
в SICStus Prolog:
| ?- sat(X*Y =:= T), X = 0.
X = 0,
T = 0 ?
Это показывает, что если первый аргумент конъюнкции является ложным, то и вся конъюнкция также ложна. Кроме того, мы можем, например, использовать решатель CLP(B) SICStus Prolog, чтобы определить, что соединение является коммутативным, используя либо taut/2
| ?- taut(A*B =:= B*A, T).
T = 1 ?
или универсально количественные переменные, обозначаемые как атомы в library(clpb)
:
| ?- sat(a*b =:= b*a).
yes
Таким образом, логические ограничения могут быть очень полезными инструментами при работе с двоичными значениями.
/2 возможно и на самом деле очень элегантно.
and(A,B) :- A,B.
or(A,B) :- A;B.
nand(A,B) :- not(and(A,B)).
nor(A,B) :- not(or(A,B)).
xor(A,B) :- or(A,B), nand(A,B).
Для использования просто замените A/B на true/false. Например:
?- and(true,true).
true.
?- and(false, true).
false.