Prolog печать определенного элемента в списке

#list #prolog

#Список #пролог

Вопрос:

У меня есть список G = [a, b, c, d, e, f, g, h, i, j]. и список T, в котором есть элементы [яблоко, виноград, a, груша, f, апельсин, дуриан]. Я хочу выполнить печать как FirstElement в T -> элемент в G -> LastElement в T, например. яблоко, a, f, дуриан. Моя проблема теперь может отображать только apple -> durian, но не печатается 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. Теперь, когда вы удалили oh/5, вы можете видеть, что некоторая переменная (например, X и G в первом предложении PrintFormat ) не привязана ни к какому значению. Итак, какое значение, как вы ожидаете, X может принять там?

Ответ №1:

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

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

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

 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).
  

Комментарии:

1. Спасибо, теперь я могу печатать только apple, а затем возвращать false.