Не подходит для полного решения, но вот некоторые подсказки.
Базовый подход
% 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.