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