1

Дано задание составить программу, содержащую данные факты и правила, связывающие между собой параллельные и перпендикулярные прямые. даны прямые a,b,c, соответственно прямая а параллельна прямой b, прямая b параллельна прямой c. Данных о перпендикулярности в моем случае нету. Вот код программы:

domains
 s=symbol
predicates  
 paraleln(s,s)
 paraleln2(s,s)
 paraleln3(s,s)
clauses
 paraleln(a,b).
 paraleln(b,c).
 paraleln2(a,b):-paraleln(a,b);paraleln(b,a).
 paraleln3(b,c):-paraleln2(b,a),paraleln2(a,c);
 paraleln2(c,a),paraleln2(a,b);paraleln2(b,c).

Задать вопрос:

*Параллельны ли указанные прямые?
*Перпендикулярны ли указанные прямые?
*Какие прямые параллельны(перпендикулярны) указанной прямой?
*Какие прямые параллельны или перпендикулярны указанной прямой?
*Существуют ли прямые, одновременно параллельны и перпендикулярны?

Что то делаю не так, ибо если просто делать как факт, то смысл от описанных правил нету(эти правила показаны как примеры (коммутативности и ассоциативности). И если дописать "paraleln(все варианты параллельности), то он выдает ответ и всё, но считаю не правильно это, тогда в чем ошибка?

Snake
  • 23

1 Answers1

0

Данных о перпендикулярности в моем случае нету.

В таком случае упростим вопросы Вашего задания:

Задать вопрос:

1. Параллельны ли указанные прямые?

2. Какие прямые параллельны указанной прямой?

Что то делаю не так, ибо если просто делать как факт, то смысл от описанных правил нету(эти правила показаны как примеры (коммутативности и ассоциативности). И если дописать "paraleln(все варианты параллельности), то он выдает ответ и всё, но считаю не правильно это, тогда в чем ошибка?

Данную задачу можно представить так:

domains
 ln = symbol % line name
 rn = symbol % rule name
 pn = symbol % fact name

predicates
fact( fn, ln, ln ).
rule( rn, ln, ln ).
q1.
q2.

clauses

fact( parallel, a, b ).
fact( parallel, b, c ).
%
rule( commutativity, A, B ):-
    fact( parallel, A, B );
    fact( parallel, B, A ).
rule( commutativity, C, A ) :-
    fact( Fact, A, B );
`   fact( Fact, B, C ).

%
rule( associativity, B, C ) :-
    ( 
       fact( parallel, B, A ),
       fact( parallel, A, C ) 
    );
    ( 
       fact( parallel, C, A ),
       fact( parallel, A, B )
    );
    fact( parallel, B, C ).

 q1 :- prompt( "Прямая 1:", L1 ), 
       prompt( "Прямая 2:", L2 ),
       write( "Параллельны ли указанные прямые?" ),
       rule( _ , L1, L2 ).

 q2 :- prompt( "Прямая :", L1 ),
       findall( L2, rule( _, L1, L2 ), Ls ),
       write("Прямые, параллельные указанной прямой", Ls).       

goal
    q1, q2.