Определите операторы И, ИЛИ, НЕ в Прологе - PullRequest
0 голосов
/ 05 июня 2018

Я должен определить программу пролога, которая дает таблицу истинности для логической формулы, например:

(a или не (b и c))

где логические переменные могут иметь только значение true или false, а единственными операторами являются AND, OR и NOT.Программа должна вести себя так:

table(a and (b or non a)).

[a, b]
[v, v] v
[v, f] f
[f, v] f
[f, f] f
yes

Что я сделал, так это определил 3 оператора, но я не знаю, как продолжить.Вы можете мне помочь?

:- op(30,fx,non).
:- op(100,xfy,or).
:- op(100,xfy,and).

1 Ответ

0 голосов
/ 06 июня 2018

Не подходит для полного решения, но вот некоторые подсказки.

Базовый подход

% fact: truth value "v" is satisfiable in all environments.
sat(v,_).

% rule: and(X,Y) is satisfiable in environment E iff both X and Y are sat in E
sat(and(X,Y),E) :- sat(X,E), sat(Y,E).

Привязки

sat(Var, E) :- 
  (member(Var:Value,E) -> 
    Value = v 
  ; throw(unknown_variable(Var,E))).

Пример:

[eclipse 6]: sat(o,[o:v]).

Yes (0.00s cpu)
[eclipse 7]: sat(o,[o:f]).

No (0.00s cpu)
[eclipse 8]: sat(o,[u:v]).
uncaught exception in throw(unknown_variable(o, [u : v]))
Abort

Перечисление

Определите правило ( привязка ), которое привязывает переменную к значению недетерминированно, и другое ( привязка ), которое связывает списоксимволов (атомов) в список привязок.

% Two different solution possible when binding Var
binding(Var, Var:v).
binding(Var, Var:f).

% Lists of bindings
bindings([],[]).
bindings([V|VL],[B|BL]) :-
  binding(V,B), 
  bindings(VL,BL).

Например:

[eclipse 9]: bindings([a,b,c],L).

L = [a : v, b : v, c : v]
Yes (0.00s cpu, solution 1, maybe more) ? ;

L = [a : v, b : v, c : f]
Yes (0.00s cpu, solution 2, maybe more) ? ;

L = [a : v, b : f, c : v]
Yes (0.00s cpu, solution 3, maybe more) ? ;

L = [a : v, b : f, c : f]
Yes (0.00s cpu, solution 4, maybe more) ? ;

L = [a : f, b : v, c : v]
Yes (0.00s cpu, solution 5, maybe more) ? ;

L = [a : f, b : v, c : f]
Yes (0.00s cpu, solution 6, maybe more) ? ;

L = [a : f, b : f, c : v]
Yes (0.00s cpu, solution 7, maybe more) ? ;

L = [a : f, b : f, c : f]
Yes (0.00s cpu, solution 8)

Операторы

Сначала вы можете объявить следующий предикат and:

and(0,0,0).
and(1,0,0).
and(0,1,0).
and(1,1,1).

Правило может применяться как and(X,Y,R), а R является результатом операции and.То же самое можно сделать с помощью or и т. Д.

Ваше объявление:

:- op(100,xfy,and).

... позволяет писать X and Y вместо and(X,Y), но обратите внимание, как это происходитнет третьего аргумента здесь.В среде ECLiPSe операторная нотация также используется вместе с is/2 для вычисления арифметических выражений.Так как вышеприведенный предикат add имеет дело с числами, следующие работы:

X is 0 and 1.

Выше объединяет X с 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...