Программирование на языке Пролог | страница 104
?- имя(а,b,с) =.. X.
X = [имя,а,b,с]
?- присоединить([А|В],С, [A|D]) =..L.
A = _2, В = _3, С = _4, D = _5, L = [присоединить,[_2|_3],_4,[_2|_5]]
?- [a,b,c,d] =..L.
L = ['.',a,[b,c,d]].
?- (a+b) =.. L.
L = [+,a,b].
?- (a+b) =..
[+,A,B] A = а, В = b
?- [a,b,c,d] =..
[A|B] A = '.', В = [a,[b,c,d]]
?- X =.. [a,b,c,d]
X = a(b,c,d).
?- X =.. [присоединить,[a,b,],[c],[a,b,c]].
X = присоединить([а,b],[с],[а,b,с])
Примеры использования предиката =.. приведены в разд. 7.12.
В то время как предикаты functor, arg и =.. используются для формирования произвольных структур и доступа к их аргументам, предикат name используется для работы с произвольными атомами. Предикат name сопоставляет атому список литер (их ASCII кодов), из которых состоит этот атом. Данный предикат можно использовать как для определения литер, составляющих указанный атом, так и для определения атома, содержащего заданные литеры. Целевое утверждение name(A, L) означает, что литеры, образующие атом А, являются элементами списка L. Если аргументу А уже присвоено значение, то Пролог создает список литер и пытается сопоставить его с L. В противном случае Пролог использует список L для создания атома, который станет значением А. Приведем примеры использования предиката name:
?- name(apple,X).
X = [97,112,112,108,100]
?- name(X,[97,l12,112,108,100]).
X = apple
?- name(apple,"apple").
да
?- name(apple,"pear").
нет
В разд. 9.5 предикат name используется для доступа к внутренней структуре слов английского языка, представляемых атомами Пролога.
6.6. Воздействие на процесс возврата
В Прологе есть два встроенных предиката, изменяющих нормальную последовательность событий, происходящих в процессе возврата. Предикат «!» устраняет возможности для повторного согласования целевых утверждений, а предикат repeat создает новые альтернативы там, где их не было ранее.