El prólogo es una lengua de la programación de lógica . Es una lengua de fines generales asociada a menudo a la inteligencia artificial y a la lingu5ística computacional . Tiene un subconjunto puramente lógico, llamado " Prolog" puro;, así como un número de características extralogical. El prólogo era uno de los primeros lenguajes el de programación de lógica, y sigue siendo entre el más popular tales idiomas hoy, con muchas puestas en práctica libres y comerciales disponibles.

Como en toda lógica lenguajes el de programación, un programa del prólogo consiste en un sistema de las cláusulas . Cada cláusula define un caso para el cual un cierto predicado definido por el usario (relación entre un cierto número de las variables lógicas ) sea verdad. El intérprete del prólogo intenta determinar, basado en las cláusulas que sabe, si un predicado dado es verdad para un sistema dado de valores de sus variables. Si no todas esas variables se dan valores, después los intentos del intérprete para determinar todos los valores posibles de las variables sin especificar que harían la declaración verdad. Esto hace prólogo (y otros lenguajes el de programación de lógica) particularmente útiles para la base de datos, las matemáticas simbólicas, y los usos del análisis de la lengua. Porque el prólogo no prohibe a predicados impuros de, la comprobación del valor de verdad de ciertos predicados especiales puede tener cierto efecto secundario deliberado, tal como impresión un valor a la pantalla. Esto permite que el programador utilice una cierta cantidad convencional programado imprescindible cuando el paradigma lógico es incómodo.

Historia

El prólogo conocido del fue elegido por el Felipe Roussel como abreviatura para el logique ( francés del en del programmation del franco del para el que programa en la lógica ). Fue creado alrededor de 1972 por el Alain Colmerauer con el Felipe Roussel, basado en interpretación procesal de s de Kowalski Roberto 'de las cláusulas del cuerno fue motivado en parte por el deseo de reconciliar el uso de la lógica como lengua declarativa de la representación de conocimiento con la representación procesal del conocimiento que era popular en Norteamérica en el finales de los sesenta y las comienzos de los años 70.

Mucho del desarrollo moderno del prólogo vino del ímpetu del proyecto (FGCS) de los sistemas informáticos de la quinta generación, que desarrolló una variante de la lengua nombrada prólogo del núcleo para su sistema operativo del primer .

El prólogo puro fue restringido original al uso de un prover del teorema de la resolución con las cláusulas del cuerno de la forma:

H:- B1,…, Bn.

El uso del teorema-prover trata las cláusulas tales como procedimientos:

para demostrar/solucionar H, la demostración/soluciona B1 y… y Bn.

El prólogo puro era pronto extendido, sin embargo, incluir la negación como falta, en la cual las condiciones negativas de la forma no (Bi) son demostradas intentando y no pudiendo para solucionar las condiciones correspondientes Bi del positivo.

Tipos de datos

El solo tipo de datos del prólogo es el término del . Los términos son los átomos del, los números del, las variables del o los términos compuestos del .

Un átomo es un nombre de fines generales sin el significado inherente. Se compone de una secuencia de carácteres que sea analizada por el intérprete del prólogo como sola unidad. Los átomos son generalmente palabras peladas en el código del prólogo, escrito sin sintaxis especial. Sin embargo, los átomos que contienen espacios o ciertos otros carácteres especiales se deben rodear por apóstrofes. Los átomos que comienzan con una mayúscula deben también ser cotizados, puesto que serían de otra manera indistinguibles de variables. El nombre de cualquier predicado debe ser un átomo. La lista vacía, escrita, es también un átomo, a pesar de su nombre inusual. Otros ejemplos de átomos incluyen x, el azul, el “Taco”, y “un poco de átomo”.

Los números pueden ser flotadores o números enteros. Muchas puestas en práctica del prólogo también proporcionan números enteros ilimitados y números racionales.

Las variables son denotadas por una secuencia que consiste en letras, números y carácteres de la raya, y comenzando con una letra mayúscula o una raya. Las variables se asemejan de cerca a variables en lógica en que son placeholders para los términos arbitrarios. Una variable puede ejemplificarse (limitar para igualar un término específico) vía la unificación . Una sola raya (_) denota un variable anónimo y significa el " cualquie term". Desemejante de otras variables, la raya no representa el mismo valor por todas partes que ocurre dentro de una definición del predicado.

Un término del compuesto del se compone de un átomo llamado un " functor" y un número de " arguments", que son otra vez términos. Los términos compuestos se escriben ordinariamente como átomo del functor seguido por una lista coma-separada de términos de la discusión, que se contiene entre paréntesis. El número de discusiones se llama el Arity del término. Un átomo se puede mirar como término compuesto con el Arity cero.

Los ejemplos de términos compuestos son carro (“Mazda”, 1986) y “amigos” (zelda, tom (vecino), tom (trabajo)). Algunos términos compuestos con functors especiales llamaron el " operators" puede ser escrito en la notación de infijo. Por ejemplo, los términos + (a, b) y = (X, Y) se puede también escribir como a+b y X=Y, respectivamente. Los usuarios pueden también declarar los átomos arbitrarios como nuevos operadores del infijo o del posfijo para permitir notaciones domain-specific. El f/n de la notación es de uso general denotar un término con el f del functor y el n del arity.

Casos especiales de términos compuestos:
las listas del

se definen inductivo: El átomo es una lista. Un término compuesto con functor. (punto) y el arity 2, cuya segunda discusión es una lista, es sí mismo una lista. Existe sintaxis especial para denotar listas: . (A, B) es equivalente a. Por ejemplo, la lista. (3,))) puede también ser escrito como | [2 | [3 | []]], o aún más compacto como.
El encadena : Una secuencia de carácteres rodeados por cotizaciones es equivalente a una lista de códigos de carácter (numéricos), generalmente en la codificación local del carácter o el Unicode si las ayudas de sistema Unicode.

Programación en prólogo

Los programas del prólogo describen las relaciones, definidas por medio de cláusulas. El prólogo puro se restringe a las cláusulas, un subconjunto Turing-completo del cuerno de la lógica de predicado de primer orden . Hay dos tipos de cláusulas: Hechos y reglas. Una regla está de la forma

Cabeza:- cuerpo.

y se lee como " La cabeza es verdad si el cuerpo es true". El cuerpo de una regla consiste en llamadas a los predicados, que se llaman las metas de la regla. El predicado incorporado, /2 denota la conjunción de metas, y; /2 denota la separación . Las conjunciones y las separaciones pueden aparecer solamente en el cuerpo, no en el jefe de una regla. Las cláusulas con los cuerpos vacíos se llaman los hechos . Un ejemplo de un hecho es:

gato (tom).

cuál es equivalente a la regla:

gato (tom):- verdad.

El predicado incorporado true/0 es siempre verdad.

Dado sobre hecho, uno puede pedir:

¿el es tom al gato?

¿? - gato (tom). Sí

¿ qué cosas son gatos?

¿? - gato (X). X = tom

Debido a la naturaleza emparentada de muchos predicados incorporados, pueden ser utilizadas típicamente en varias direcciones. Por ejemplo, length/2 se puede utilizar para determinar la longitud de una lista (length (lista, L), dado una lista List) así como para generar un esqueleto de la lista de una longitud dada (length (X, 5)), y también generar ambos esqueletos de la lista y sus longitudes juntas (length (X, L)). Semejantemente, append/3 se puede utilizar para añadir dos listas (append (ListA, ListB, X) dado enumera ListA y ListB) así como para partir una lista dada en las piezas (append (X, Y, lista) , dado una lista List). Por esta razón, un sistema comparativamente pequeño de predicados de la biblioteca es suficiente para muchos programas del prólogo. Todos los predicados se pueden también utilizar para realizar las pruebas de la unidad: Las preguntas pueden ser encajadas en programas y permitir para la prueba de regresión de tiempo de compilación automática.

Como lengua de fines generales, el prólogo también proporciona varios predicados incorporados para realizar actividades rutinarias como entrada-salida, usar gráficos y de otra manera la comunicación con el sistema operativo. Estos predicados no se dan un significado emparentado y son solamente útiles para los efectos secundarios que exhiben en el sistema. Por ejemplo, el predicado write/1 exhibe un término en la pantalla.

Evaluación

La ejecución de un programa del prólogo es iniciada por la fijación del usuario de una sola meta, llamada la pregunta. Lógicamente, los intentos del motor del prólogo para encontrar una refutación de la resolución de la pregunta negada. El método de la resolución usado por Prolog se llama la resolución SLD. Si la pregunta negada puede ser refutada, sigue que la pregunta, con los atascamientos variables apropiados en el lugar, es una consecuencia lógica del programa. En ese caso, todos los atascamientos variables generados se divulgan al usuario, y la pregunta se dice para haber tenido éxito. Operacionalmente, la estrategia de la ejecución del prólogo se puede pensar en como generalización de las llamadas de función en otras idiomas, una diferencia que es que las cabezas múltiples de la cláusula pueden emparejar una llamada dada. En ese caso, el sistema crea un opción-punto, unifica la meta con el jefe de la cláusula de la primera alternativa, y continúa con las metas de esa primera alternativa. Eventualmente la meta falla en el curso de ejecutar el programa, todos los atascamientos variables que fueron hechos puesto que se deshace el opción-punto más reciente fue creado, y la ejecución continúa con la alternativa siguiente de ese opción-punto. Esta estrategia de la ejecución se llama la vuelta hacia atrás cronológica . Por ejemplo:

hermano (X, Y):- parent_child (Z, X), parent_child (Z, Y). parent_child (X, Y):- father_child (X, Y). parent_child (X, Y):- mother_child (X, Y). mother_child (trude, sally). father_child (tom, sally). father_child (tom, Erica). father_child (micrófono, tom).

Esto da lugar a la pregunta siguiente que es evaluada como verdad:

¿? - hermano (sally, Erica). Sí

Se obtiene esto como sigue: Inicialmente, la única cláusula-cabeza que empareja para el hermano de la pregunta (sally, Erica) es primera, así que probar la pregunta es equivalente a probar el cuerpo de esa cláusula con los atascamientos variables apropiados en el lugar, es decir, la conjunción (parent_child (Z, sally), parent_child (Z, Erica)). La meta siguiente que se probará es la extrema izquierda de esta conjunción, es decir, parent_child (Z, sally). Dos cabezas de la cláusula emparejan esta meta. El sistema crea un opción-punto e intenta la primera alternativa, cuyo cuerpo es el father_child (Z, sally). Esta meta se puede probar usar el father_child del hecho (tom, sally), así que se genera el atascamiento Z = tom, y la meta siguiente que se probará es la segunda parte de la conjunción antedicha: parent_child (tom, Erica). Una vez más esto se puede probar por el hecho correspondiente. Puesto que todas las metas podrían ser probadas, la pregunta tiene éxito. Puesto que la pregunta no contuvo ninguna variable, no se divulga ningunos atascamientos al usuario. Una pregunta con variables, como:

¿? - father_child (padre, niño).

enumera todas las respuestas válidas en la vuelta hacia atrás.

Notar que con el código como se declaró anteriormente, el hermano de la pregunta (sally, sally) también tiene éxito (X = Y). Uno insertaría metas adicionales para describir las restricciones relevantes, si estuvo deseado.

Lazos y repetición

Los algoritmos iterativos se pueden ejecutar por medio de predicados recurrentes. Los sistemas del prólogo ejecutan típicamente una técnica de optimización bien conocida llamada optimización de la llamada de la cola (TCO) para los predicados deterministas que exhiben la repetición de la cola o, más generalmente, la cola llama: El marco de apilado de una cláusula se desecha antes de realizar una llamada en una posición de la cola. Por lo tanto, los predicados cola-recurrentes deterministas se ejecutan con el espacio constante del apilado, como lazos en otras idiomas.

Negación

El predicado incorporado \ +/1 del prólogo proporciona la negación como falta, que permite el razonamiento no monotónico . El " de la meta; \ + ilegal (X)" en la regla

legal (X):- \ + ilegal (X).

se evalúa es sigue: El prólogo intenta probar ilegal (X). Si una prueba para esa meta puede ser encontrada, la meta original (es decir, \ + ilegal (X)) falla. Si ninguna prueba puede ser encontrada, la meta original tiene éxito. Por lo tanto, \ +/1 operador de prefijo se llama el " no provable" ¿operador, puesto que el " de la pregunta;? - \ + Goal" tiene éxito si la meta no es demostrable. Esta clase de negación es sonido si se muele su discusión. Se pierde la validez si la discusión contiene variables. ¿Particularmente, el " de la pregunta;? - legal (X)." no puede ahora ser utilizado para enumerar todas las cosas que sean legales.

Consideraciones operacionales

Bajo una lectura declarativa, orden de reglas, y de metas dentro de reglas, es inaplicable puesto que la separación y la conjunción lógicas son comutativas. Procesal, sin embargo, es a menudo importante considerar la estrategia de la ejecución del prólogo, o por razones de la eficacia, o debido a la semántica de los predicados incorporados impuros para los cuales la orden de la evaluación importa.

DCGs y análisis

Hay una notación especial llamada las gramáticas definidas de la cláusula ( DCGs . Una regla definida vía -->/2 en vez de:-/2 es ampliado por el preprocesador (expand_term/2, una facilidad análoga a las macros en otras idiomas) según algunas reglas directas de la reescritura, dando por resultado cláusulas ordinarias del prólogo. Especialmente, la reescritura equipa el predicado de dos discusiones adicionales, que se pueden utilizar para roscar implícito el estado alrededor, análogas a las mónadas en otras idiomas. DCGs es de uso frecuente escribir programas de análisis o los generadores de la lista, pues también proporcionan un interfaz conveniente para enumerar diferencias.

Ejemplo del programa de análisis

Un ejemplo más grande demostrará el potencial de usar prólogo en el análisis.

Dado la oración expresada en el BNF :

:: = :: = | del :: = = ; :: = | del del :: = | :: = a | b :: = 0.9 :: = + | - | *

Esto se puede escribir en prólogo usar DCGs, correspondiendo a un programa de análisis profético con uno simbólico mira-a continuación:

oraciones --> declaración (S0), sentence_r (S0, S). sentence_r (S, S) -->. sentence_r (S0, seq (S0, S)) --> declaración (S1), sentence_r (S1, S). declaración (asignar (identificación, E)) --> identificación (identificación), expresión (E). expresión (E) --> término (T), expression_r (T, E). expression_r (E, E) -->. expression_r (E0, E) -->, término (T), expression_r (más (E0, T), E). expression_r (E0, E) -->, término (T), expression_r (menos (E0, T), E). término (T) --> factor (F), term_r (F, T). term_r (T0, T) -->, factor (F), term_r (épocas (T0, F), T). factor (identificación (identificación)) --> identificación (identificación). factor (dígito (D)) -->, {(número (D); var (D)), en medio (0, 9, D)}. identificación (a) -->. identificación (b) -->.

Este código define una relación entre una oración (dada como lista de símbolos) y su árbol de abstract syntax (AST). Pregunta del ejemplo:

¿? - frase (oración (AST),). AST = seq (asignar (a, más (el dígito (1), épocas (dígito (3), identificación (b)))), asignar (b, dígito (0))) ;

El AST se representa usar términos del prólogo y se puede utilizar para aplicar optimizaciones, para compilar tal máquina-código de las expresiones, o para interpretar directo tales declaraciones. Al igual que típico para la naturaleza emparentada de predicados, estas definiciones se pueden utilizar para analizar y para generar oraciones, y también para comprobar si un árbol dado corresponde a una lista dada de símbolos. Usar la profundización iterativa para la enumeración justa, cada oración arbitraria pero fija y su AST correspondiente será generada eventual:

¿? - longitud (símbolos, _), frase (oración (AST), símbolos). Símbolos = =, a, (;), AST = asignan (a, identificación (a)); Símbolos = =, b, (;), AST = asignan (a, la identificación (b)) etc.

Programación Higher-order

Puesto que las metas arbitrarias del prólogo se pueden construir y evaluar en run-time, es fácil escribir predicados higher-order como maplist/2, que aplica un predicado arbitrario a cada miembro de una lista dada, y sublist/3, que los elementos filtrantes que satisfacen un predicado dado, también permitiendo el que curte .

Para convertir soluciones de la representación temporal (substituciones de la respuesta en la vuelta hacia atrás) a la representación espacial (términos), el prólogo tiene varios predicados de las todo-soluciones que recojan todas las substituciones de la respuesta de una pregunta dada en una lista. Esto se puede utilizar para la comprensión de la lista. Por ejemplo, igual de los números perfectos la suma de sus divisores apropiados:

perfeccionar (N):- en medio (1, inf, N), U es N // 2, findall (D, (en medio (1, U, D), MOD de N D =: = 0), Ds), sumlist (Ds, N).

Esto se puede utilizar para enumerar números perfectos, y también para comprobar si un número es perfecto.

Meta-intérpretes y reflexión

El prólogo es una lengua de Homoiconic y proporciona muchas instalaciones para la reflexión . Su estrategia implícita de la ejecución permite escribir a un sucinto el evaluador Meta-circular (también llamado el meta-intérprete del ) para el código puro del prólogo. Puesto que los programas son ellos mismos del prólogo secuencias de términos del prólogo (:-/2 es operador de infijo) que se lean y se examinen fácilmente usar mecanismos incorporados (como read/1), es fácil escribir a los intérpretes modificados para requisitos particulares que aumentan prólogo con las características domain-specific.

Técnicas de la puesta en práctica

Para la eficacia, el código del prólogo se compila típicamente al código automático abstracto, influenciado a menudo por el sistema de instrucción basado en los registros de la máquina abstracta (WAM) de Warren. Algunas puestas en práctica emplean la interpretación abstracta para derivar la información del tipo y del modo de predicados en de tiempo de compilación, o la compilan al código automático verdadero para el alto rendimiento. La concepción de las técnicas eficientes de la puesta en práctica para el código del prólogo es un campo de la investigación activa en la comunidad de la programación de lógica, y las otras técnicas de la ejecución se emplean en algunas puestas en práctica. Éstos incluyen el binarization de la cláusula y las máquinas virtuales apilar-basadas.

Ejemplos

Aquí seguir algunos programas del ejemplo escritos en prólogo.

QuickSort

El algoritmo de clasificación de QuickSort, relacionándose una lista con su versión clasificada:

partición (, _,). partición (, pivote, cargas fraccionadas, Bigs):- (Pivote del @< de X - > Cargas fraccionadas =, partición (Xs, pivote, resto, Bigs) ; Bigs =, partición (Xs, pivote, cargas fraccionadas, resto) ). quicksort () --> {partición (Xs, X, más pequeño, más grande)}, quicksort (más pequeño), quicksort (más grande).

Máquina de Turing

Lo completo de Turing del prólogo puede ser demostrado usándolo para simular una máquina de Turing:

el turing (Tape0, cinta):- realizarse (q0, Ls, Tape0, Rs), invertir (Ls, Ls1), añadir (Ls1, Rs, cinta). realizarse (qf, Ls, Ls, Rs, Rs):-!. realizarse (Q0, Ls0, Ls, Rs0, Rs):- símbolo (Rs0, Sym, RsRest), una vez que (regla (Q0, Sym, Q1, NewSym, acción)), acción (acción, Ls0, Ls1, Rs1), realizarse (Q1, Ls1, Ls, Rs1, Rs). símbolo (, Sym, Rs). acción (dejada, Ls0, Ls, Rs0, Rs):- ido (Ls0, Ls, Rs0, Rs). acción (estancia, Ls, Ls, Rs, Rs). acción (correcta, Ls0, Rs). izquierdo (, Ls, Rs,).

Una máquina de Turing del ejemplo simple es especificada por los hechos:

regla (q0, 1, q0, 1, derechos). regla (q0, b, qf, 1, estancia).

Esta máquina realiza el aumento por uno de un número en la codificación singular: Coloca sobre cualquier número de " 1" las células y añaden un " adicional; 1" en el extremo. Pregunta y resultado del ejemplo:

¿? - el turing (, Ts). Ts = 1, 1, 1;

Este ejemplo ilustra cómo cualquier cómputo se puede expresar declarativamente como secuencia de transiciones del estado, ejecutado en prólogo como relación entre los estados sucesivos del interés. Como otro ejemplo para esto, un recopilador de optimización con tres pasos de la optimización se podía ejecutar como relación entre un programa inicial y su forma optimizada:

program_optimized (Prog0, Prog):- optimization_pass_1 (Prog0, Prog1), optimization_pass_2 (Prog1, Prog2), optimization_pass_3 (Prog2, Prog).

o equivalente usar la notación de DCG:

program_optimized --> optimization_pass_1, optimization_pass_2, optimization_pass_3.

Programación dinámica

La programación dinámica del prólogo del programa siguiente de las aplicaciones para encontrar el subsequence común más largo de dos listas en tiempo polinómico. La base de datos de la cláusula se utiliza para el Memoization :

:- stored/1. nota (meta):- (almacenado (meta) - > verdad; Meta, assertz (almacenado (meta)) ). ¡LCS (,):-!, nota (LCS (Xs, Ys, Ls)). LCS (, Ls):- nota (LCS (, Ys, Ls1)), nota (LCS (Xs, Ls2)), longitud (Ls1, L1), longitud (Ls2, L2), (L1 >= L2 - > Ls = Ls1; Ls = Ls2).

Pregunta del ejemplo:

¿? - LCS (, Ls). Ls = j, a, u

Algunos sistemas del prólogo, como el BProlog y el XSB, ejecutan una extensión llamada que tabula, que libera a usuario manualmente de almacenar resultados intermedios.

Extensiones


la programación de lógica del constreñimiento es importante para muchos usos del prólogo en ajustes industriales, como la tabulación del tiempo y otras tareas de previsión. La mayoría de los sistemas del prólogo envían con por lo menos un disolvente del constreñimiento para los dominios finitos, y a menudo también con los disolventes para otros dominios como números racionales.
El HiLog y el λProlog amplían prólogo con las características programadas Higher-order .
la F-lógica amplía prólogo con los marcos/los objetos para la representación de conocimiento .
El prólogo OW se ha creado para contestar a la carencia del prólogo de gráficos y del interfaz.
El Logtalk es una extensión orientada al objeto de la fuente abierta al lenguaje de programación del prólogo. Programación de lógica de integración con la programación orientada al objeto y event-driven, es compatible con la mayoría de los recopiladores del prólogo. Apoya prototipos y clases. Además, apoya la programación component-based a través de la composición categoría-basada.
El Prólogo-MPI es una extensión del SWI-Prólogo de la abrir-fuente para la computación distribuida sobre el mensaje que pasa el interfaz .

Idiomas relacionadas


prólogo visual, también conocido antes como el prólogo PDC y prólogo de Turbo del . El prólogo visual es un dialecto orientado al objeto strongly-typed del prólogo, que es considerablemente diferente de prólogo estándar. Pues el prólogo de Turbo él fue puesto por Borland, pero él ahora es convertido y puesto por la firma danesa PDC (centro de desarrollo del prólogo) que lo produjo original.
El Datalog es realmente un subconjunto de prólogo. Se limita a las relaciones que pueden ser estratificadas y no permiten términos compuestos. En contraste con prólogo, Datalog no es Turing-completo.
En cierto modo el prólogo es un subconjunto del planificador, e., ver la historia temprana de Kowalski de la programación de lógica. Las ideas en planificador eran más adelante desarrolladas más lejos en la metáfora de la comunidad científica.

Los armazones también existen que pueden proporcionar un puente entre el prólogo y el lenguaje de programación de Java:

InterProlog, un puente de la biblioteca de programas entre el Java y prólogo, ejecutando el predicado/el método bidireccionales que llaman entre ambas idiomas. Los objetos de Java se pueden trazar en prólogo llaman y viceversa. Permite el desarrollo GUIs y de la otra funcionalidad en Java mientras que deja la lógica que procesa en la capa del prólogo. Apoya el XSB, el SWI-Prólogo y el LADRIDO.
El Prova provee de la integración nativa del sintaxis Java, mensajería del agente y reglas de la reacción. Prova se coloca como sistema scripting (RBS) basado en las reglas para el software intermediario. La lengua rompe las nuevas bases en combinar el imprescindible y el programado declarativo.

Ver también


Alicia (lenguaje de programación) del


onza (lenguaje de programación)
Mercury (lenguaje de programación)
Prólogo visual
El balbucea (lenguaje de programación)
Poplog
Satisfacción del constreñimiento
Roberto Kowalski
Alain Colmerauer
Comparación de las puestas en práctica del prólogo
Conformidad de los estándares del prólogo
Lógica de primer orden
Lenguaje de programación del planificador
λProlog
Prólogo OW
Prólogo de la fresa
SWI-Prólogo
Prova
Logtalk
Datalog

.

  • Zenithic
  • East Waterloo Dock
    Random links:Raúl Grijalva | Academia de Montgomery Bell | Duque Island | WTVE | Caerulea del Nymphaea

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">