Главная / Программирование /
Стили и методы программирования / Тест 6
Стили и методы программирования - тест 6
Упражнение 1:
Номер 1
Унифицируются ли и Как унифицируются следующие выражения:
f(X, g(Y), h(Y))
U(h(A), g(g1(X)), Z)
Ответ:
 (1) не унифицируются 
 (2) X= h(A), Y=g1(X), Z=h(Y), U=f
 
 (3) Z=h(g1(h(A))), U=f
 
 (4) X= h(A), Y=g1(h(A)), Z=h(g1(h(A))), U=f
 
Номер 2
Унифицируются ли и Как унифицируются следующие выражения:
V(f(X,Y), U(Y), h(Y))
U(V(a,b), g(b), Z)
Ответ:
 (1) не унифицируются 
 (2) X= a, Y=b, Z=h(Y), U=g, V=f
 
 (3) Z=h(b), U=g, V=f
 
 (4) X= a, Y=b, Z=h(b), U=g, V=f
 
Номер 3
Унифицируются ли и Как унифицируются следующие выражения:
V(f(X,Y), U(Y), h(X))
f(V(a,b), g(b), Z)
Ответ:
 (1) не унифицируются 
 (2) X= a, Y=b, Z=h(X), U=g, V=f
 
 (3) Z=h(a), U=g, V=f
 
 (4) X= a, Y=b, Z=h(b), U=g, V=f
 
Упражнение 2:
Номер 1
Унифицируются ли и Как унифицируются следующие выражения:
f(X, g(Y), h(Y))
f(h(X), g(g1(X)), Z)
Ответ:
 (1) не унифицируются 
 (2) X= h(X), Y=g1(Y), Z=h(Z)
 
 (3) Z=h(g1(h(h(...X...)))), x= h(...X...), Y=g1(h(...X...))
, где h
повторяется бесконечное число раз 
 (4) X= h(X), Y=g1(h(X)), Z=h(g1(h(X)))
 
 (5) по определению не унифицируется, но в некоторых версиях языка Prolog
будет выдано Z=h(g1(h(h(...X...)))), x= h(...X...), Y=g1(h(...X...))
, где h
повторяется бесконечное число раз 
Номер 2
Унифицируются ли и Как унифицируются следующие выражения:
f(X, g(Y, h(Y)))
F(h(a), g(F(X), Z))
Ответ:
 (1) не унифицируются 
 (2) x=h(a), Y=F(X), Z=h(Y) F=f
 
 (3) Z=h(f(h(a))), X=h(a), Y=f(h(a)) F=f
 
 (4) x=h(X), Y=f(h(X)), Z=h(f(h(X))), a=X, F=f
 
 (5) F=f, X=h(a), Y=F(h(a)), Z=h(F(h(a)))
 
Номер 3
Унифицируются ли и Как унифицируются следующие выражения:
f(F(X), g(Y, h(Y)))
F(h(a), g(F(X), Z))
Ответ:
 (1) не унифицируются 
 (2) x=h(a), Y=F(X), Z=h(Y), F=f
 
 (3) Z=h(f(h(a))), x=h(a), Y=f(h(a)), F=h
 
 (4) x=h(X), Y=f(h(X)), Z=h(f(h(X))), a=X, F=h
 
 (5) F=f, X=h(a), Y=F(h(a)), Z=h(F(h(a)))
 
Упражнение 3:
Номер 1
Чем отличается в худшую сторону реализация принципа, положенного в основу языка Prolog
, от принципа в исходном виде?
Ответ:
 (1) в основу языка Prolog
положена логика, а в самом языке она не реализована 
 (2) в основу языка Prolog
положен метод резолюций, но унификация не реализована 
 (3) в принципе программа должна быть недетерминированной, а в языке точно предписано, какое из предложений дожно быть выбрано при наличии нескольких подходящих вариантов 
 (4) в фрагменте логики, на которую опирается язык Prolog
, нет отрицаний, а в языке они введены 
Номер 2
Чем отличается в лучшую сторону реализация принципа, положенного в основу языка Prolog
, от принципа в исходном виде?
Ответ:
 (1) в основу языка Prolog
положена статическая классическая логика, а в самом языке появилась база динамически обновляемых знаний 
 (2) в методе резолюций, на котором основан Prolog
, поиск вывода растет в ширину, а в языке подстановки идут нелинейно 
 (3) в логике задаются лишь сведения, а в языке можно задавать и прямые предписания 
 (4) в фрагменте логики, на которую опирается язык Prolog
, нет отрицаний. В языке они корректно введены 
Номер 3
Чем отличается принцип управления языка Prolog
, от принципов управления традиционных языков?
Ответ:
 (1) в основу языка Prolog
положена классическая логика, а традиционных языков - теория рекурсивных функций 
 (2) в языке Prolog
ищется вывод, а в традиционных языках вычисляется программа 
 (3) в языке Prolog
неудача и возврат к новой альтернативе являются основным способом управления, а в традиционных языках исключительные ситуации обрабатываются как некая полупатология, и возможности выбора другой альтернативы после неудачи нет 
 (4) в языке Prolog
нет присваивания и циклов и все приходится выражать через рекурсии 
Упражнение 4:
Номер 1
Как организовано динамическое вычисление программ в языке Prolog
?
Ответ:
 (1) имеется предикат consult
, который позволяет ввести блок программы либо данных 
 (2) имеется предикат eval
, который позволяет вычислить любое сконструированное в программе выражение 
 (3) имеется предикат assert
, который позволяет вставить в программу вычисленные в ходе ее исполнения предложения и факты 
 (4) имеется предикат retract
, который позволяет удалить из программы более ненужные предложения и факты 
 (5) имеется специальный предикат отсечения !
, позволяющий динамически управлять точками возврата 
Номер 2
Как организовать ввод небольшого блока данных в языке Prolog
?
Ответ:
 (1) имеется предикат consult
, который позволяет ввести блок программы либо данных 
 (2) имеется предикат eval
, который позволяет вычислить любое сконструированное в программе выражение 
 (3) имеется предикат retractall
, который позволяет удалить из программы более ненужные предложения и факты 
 (4) имеется специальный предикат отсечения !
, позволяющий динамически управлять точками возврата 
Номер 3
Как организовать ввод последовательности данных в языке Prolog
?
Ответ:
 (1) имеется предикат consult
, который позволяет ввести блок программы либо данных 
 (2) имеется предикат eval
, который позволяет вычислить любое сконструированное в программе выражение 
 (3) имеется предикат read
, который позволяет ввести один терм, а данные нужно предварительно преобразовать к последовательности термов, если они уже не имеют такой вид, с помощью внешней программы 
 (4) имеются предикаты put_byte
и put_char
, которые позволяют написать подпрограмму ввода любых данных 
Упражнение 5:
Номер 1
Программист написал следующее предложение, желая выполнить свой оператор proceed_with
, имеющий побочный эффект вывода значений на экран, и заканчивающийся корректной неудачей почти всегда, для всех начал списка X
вплоть до успеха действий:
accepted(X):- repeat, X=[Y|Z], nu_ee(Z), proceed_with(Y).
nu_ee(Z).
Что он получит?
Ответ:
 (1) то, что хотел 
 (2) ошибку 
 (3) переполнение стека 
 (4) бесконечную выдачу значений для первого члена списка 
 (5) то, что хотел, но пустой список не будет рассмотрен в качестве начала 
Номер 2
Какое предложение применяется первым?
Ответ:
 (1) целевое предложение программы 
 (2) первое из описанных в программе 
 (3) функция Main
 
 (4) функция Go
 
 (5) функция Prolog
 
Номер 3
Программист написал следующие предложения, желая выполнить свой оператор proceed_with
, имеющий побочный эффект вывода значений на экран и заканчивающийся корректной неудачей почти всегда, для всех начал списка X
вплоть до успеха действий:
my_call(H,X):- not(X=[]), proceed_with(H).
my_call(H,[Y|Z]):- append(H,[Y],U), my_call(U,Z).
accepted(X):- my_call([],X).
Что он получит?
Ответ:
 (1) то, что хотел 
 (2) ошибку 
 (3) переполнение стека 
 (4) бесконечную выдачу значений для первого члена списка 
 (5) то, что хотел, но пустой список не будет рассмотрен в качестве начала