Написать программу вычисления значения логического выражения в дизъюнктивной нормальной форме.
Исходный код программы на SWI Prolog:
:-op(120,xfy,v).
:-op(110,xfy,&).
:-op(100,fy,^).
p(true).
p(^false).
p(A v B):-p(A);p(B).
p(A&B):-p(A),p(B).
%primer zaprosa
%?-p((true & ^false & true)v(false & true & ^false)v false).
%i nemnogo izmenennii
%?-p((true & false&true)v(false & true & ^false)v false).
Описание:
Здесь объявляются операторы, первый параметр значит приоритет, чем число меньше, тем приоритет выше
второй тип, бинарный он или унарный и в какой приоритет аргументов относительно оператора
(про это можно почитать в инете, например тут http://isr.by.ru/prolog/ch3_3.htm, то вообще для данного случая можно и не вникать),
третий параметр - сам оператор.
=-Op(120,xfy,v). оператор логического ИЛИ, имеет самый низкий приоритет, бинарный.
=-Op(110,xfy,&). оператор логического И, имеет приоритет выше, бинарный.
=-Op(100,fх,^). оператор логического НЕ, имеет самый высокий приоритет, унарный.
Сами правила имеют следующий вид
p(true). т.е если у нас выражение состоит только из этого слова, то истина
p(^false). если из Не ЛОЖЬ, то тоже истина
p(A v B):-p(A);p(B). если из А ИЛИ Б, то проверяеться, чтобы выполнялось А или Б
p(A&B):-p(A),p(B). если из А И Б, то проверяеться, чтобы выполнялись А и Б
Зачем объявление операторов? Без них бы и не компилилось, такой синтаксис не возможен просто
доя буковок не значащих, но даже если бы все записывалось в допустимом синтаксисе, то
компьютер сам бы не делал анализ выражения... а так делает, можно ставить скобки, можно
ставить пробелы между операторами и словами ИСТИНА и ЛОЖЬ |