Пролог распечатать определенный элемент в списке - PullRequest
0 голосов
/ 20 октября 2011

У меня есть список G = [a, b, c, d, e, f, g, h, i, j]. и список Т, в котором есть элементы [яблоко, виноград, груша, апельсин, дуриан]. Я хочу сделать печать как FirstElement в T -> элемент в G -> LastElement в T например. яблоко, а, е, дуриан. Теперь моя проблема в том, что я могу показать только яблоко -> дуриан, но не печатать a, f.

G=[a,b,c,d,e,f,g,h,i,j].

in(a,'1').
in(b,'2').
in(c,'3').
........

printFormat(Prev,[H|T]) :- not(member(H,G)), printFormat(X,T).
printFormat(Prev,[H|T]) :- member(H,G]), in(H,I) write(' -> {'), write(H), write(' -> '), write(I), write('}'), printFormat(X,T).
printFormat(Prev,[Last]) :- write(' -> '), write(Last).

1 Ответ

1 голос
/ 20 октября 2011

Это неправильно:

G=[a,b,c,d,e,f,g,h,i,j].

, поскольку у вас нет глобальной переменной в Прологе (по крайней мере, с этим синтаксисом).Вы можете переписать так:

g(E) :- memberchk(E, [a,b,c,d,e,f,g,h,i,j]).

и затем использовать (ваши первые 2 предложения для printFormat могут быть переписаны так же, как и тогда, избегая дублирования линейного теста):

printFormat(Prev,[H|T]) :-
  (  (oh(X,H,_,_,_), not(g(H))  % not should be \+
  -> true
  ;  in(H,I)
  -> write(' -> {'), write(H), write(' -> '), write(I), write('}')
  ;  % this mismatch should never appear? not in(H,I)
     throw(mismatch)
  ),
  printFormat(X,T).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...