Пролог реализации и /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.
Другие вопросы по тегам