Заменить пункт в Прологе - PullRequest
0 голосов
/ 03 мая 2020

У меня есть этот код

clause2( monopati1(X,X,Monopati,Monopati), true).
clause2( monopati1(X,Z,Monopati,Teliko_monopati),
   (  akme(X,Y),
      \+(member(Y,Monopati)),
      append(Monopati,[Y],Neo_monopati),
      monopati1(Y,Z,Neo_monopati,Teliko_monopati))).    
clause2(monopati(X, Y, Monopati),
   (  monopati1(X, Y, [X], Monopati),
      write(Monopati))).

, и мне нужно заменить предложение на: «monopati1 (X, X, Monopati, Monopati)». С эквивалентным предложением "monopati1 (X, X, Monopati, Teliko_monopati): - Monopati = Teliko_monopati." Но я должен прочитать их с клавиатуры.

Итак, я сделал

write('Give clause to replace'),nl,
read(Old_clause),nl,
write('Give new clause'),nl,
read(New_clause),nl,
retract(clause2(Old_clause , _)),
assert(clause2(New_clause))

, но результат:

clause2((monopati1(A,A,B,C),B=C)).

Как мне избавиться от лишних скобок? в пункте 2 ((monopati1 (A, A, B, C), B = C)), чтобы он стал пунктом 2 (monopati1 (A, A, B, C), B = C).

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Хорошо! Я сделал это наконец-то! Я просто прочитал New_clause как список, а затем отделил голову от тела!

choice1_1(a):- 
         write('Give clause to replace'),nl,
         read(Old_clause),nl,
         write('Give new clause like : [Goal , Body]'),nl,
         read(New_clause),nl,
         retract(clause2(Old_clause , _)),
         assert_new(New_clause).

assert_new([H|[H1|T]]) :- asserta(clause2(H,H1)).

Использовал [H|[H1|T]] только для того, чтобы вставить свое тело, не будучи окруженным [].

0 голосов
/ 03 мая 2020

Ну, если New_clause - пара, то все, что вам нужно сделать, это добавить (Part1,Part2) = New_clause, перед assert, а затем просто assert(clause2(Part1,Part2)).

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