ЕСЛИ-ТО в канонической форме?

Определяя ЕСЛИ так:

dynamic(if/1).

op(200,  fx, if).
op(150, xfx, then).
op(100, xfy, and).
op(100, xfy, or).

генерирует следующую каноническую форму:

?- write_canonical(if x then y).
if(then(x,y))

?- write_canonical(if x and  z then y).
if(then(and(x,z),y))

?- write_canonical(if x and  z or t then y).
if(then(and(x,or(z,t)),y))

Есть ли способ сгенерировать:

if( conds, then(actions) ).

ИЛИ даже лучше:

if( conds, (actions) ).

как это:

if(x,y)
if(x, then(y))
if( and(x,or(z,t)),  then(y))
if( and(x,or(z,t)),  (y))

одну возможную альтернативу я вижу:)

?- op(200,  xfy, ==>).

?- write_canonical(x ==> y).
 ==>(x,y)

?- write_canonical(x and z ==> y).
 ==>(and(x,z),y)

1 ответ

Я нашел лучшее решение для генерации нормальных предложений. Вместо "тогда" я могу просто использовать ":-"

?- write_canonical(if x and z :- y ).
:-(if(and(x,z)),y)

?- assert(if x and z :- write(axz) ).
?- if x and z.
axz
Другие вопросы по тегам