Хм. Я не уверен, что понимаю вопрос и комментарии, но, возможно, у меня есть, чем поделиться. Мне очень очень жаль: это не тот код, который я написал, но я помню, что нашел его, когда впервые где-то занимался логикой в школе, и мне очень жаль, но я не помню, где я его нашел. Я также немного изменил это, потому что это было не очень хорошо, прежде чем я нашел это. Но если кто-то узнает этот код , пожалуйста, , скажите мне, и я снимаю его или приписываю реальному автору кода.
Итак, вот код, который у меня был. Я назвал это загадочно lc.pl
, потому что 2 буквы - только больше чем одна буква, но меньше, чем любое другое число. Я не знаю, что означает «с». «Я» означает логику, я надеюсь.
:- module(lc, [
bl/2,
valid/1,
contradiction/1,
lequiv/2,
truth_table/2,
op(100, fy, ?),
op(200, fy, ~),
op(500, yfx, and),
op(500, yfx, or),
op(690, yfx, =>),
op(700, yfx, <=>)]).
truth_table(F, T) :-
term_variables(F, Vs),
bagof(R-Vs, bl(F, R), T).
valid(F) :-
forall(bl(F, R), R == t).
contradiction(F) :-
forall(bl(F, R), R == f).
lequiv(F, G) :-
forall(( bl(F, X), bl(G, Y) ), X == Y).
bl(?X, R) :-
v(X, R).
bl(~X, R) :-
bl(X, R0),
not(R0, R).
bl(X and Y, R) :-
bl(X, R0),
and_bl(R0, Y, R).
bl(X or Y, R) :-
bl(X, R0),
or_bl(R0, Y, R).
bl(X => Y, R) :-
bl(X, R0),
impl_bl(R0, Y, R).
bl(X <=> Y, R) :-
bl(X, R0),
bl(Y, R1),
eq(R0, R1, R).
bl(X xor Y, R) :-
bl(X, R0),
bl(Y, R1),
xor(R0, R1, R).
v(f, f).
v(t, t).
not(t, f).
not(f, t).
and_bl(f, _, f).
and_bl(t, Y, R) :- bl(Y, R).
or_bl(f, Y, R) :- bl(Y, R).
or_bl(t, _, t).
impl_bl(t, Y, R) :- bl(Y, R).
impl_bl(f, _, t).
eq(f, Y, R) :- not(Y, R).
eq(t, Y, Y).
xor(f, Y, Y).
xor(t, Y, R) :- not(Y, R).
Извините за длинный код: - (
Вы видите term_variables/2
, но вы не видите atoms_of_expr
, потому что он не использует атомы, потому что зачем использовать атомы, когда переменные легче использовать? Я не знаю.
В любом случае, вот как я помню, чтобы использовать его для того же примера, что и ваш пример, но написано совсем по-другому:
?- truth_table(?A and ?B or ?C, Table).
Table = [f-[f, _3722, f], t-[f, _3692, t], f-[t, f, f], t-[t, f, t], t-[t, t, _3608]].
Так что, очевидно, нет README, но если вы хотите "логическую переменную", а не "логическую переменную", вам нужно написать? Infront, чтобы сделать его "логическим". Зачем ? Я не знаю. После долгих проб и ошибок я обнаружил, что должен написать? перед переменной, чтобы сделать его логическим; много кода, который не заканчивается, если вы забыли написать? перед переменной: - (
Но это имеет смысл и эквивалентность в списке операторов. Вы видите, что таблица истинности в решении сильно отличается, но на самом деле такая же.