Оператор за присвояване и сравнение
Пролог, подобно на други езици за програмиране, използва оператора=, но дали се използва като оператор за сравнение или оператор за присвояване се определя от това дали стойностите на термините са свободни или зададени. Помислете например за изразаябълки = ябълки.
Този израз може да бъде подцел, генериран в Prolog. Тъй като и двете стойности са известни, операторът = е оператор за сравнение. В този случай равенството е вярно и подцелта е успешна.
Помислете за изразаябълки = портокали.
Тъй като тези два термина имат различни значения, равенството е невярно.
Помислете за пример, който използва променлива:X = ябълки.
Този израз може също да бъде подцел, генериран в Prolog по време на опит за оценка на целта. Но тук знакът за равенство не е непременно оператор за присвояване. Тази подцел присвоява стойността apples на променливата X (което означава тази променлива) само ако X вече не е зададена. Но ако X вече има стойност, тогава тя е известна на рутинните процедури за вътрешно обединяване и се сравнява с константата на ябълките. Ако двете стойности са еднакви, тогава подцелта е успешна; ако са различни, тогава подцелта се проваля.
Интерпретацията на Prolog наоператора = зависи от това дали и двете стойности са известни или не. Ако и двете стойности са известни, тогава операторът се интерпретира като оператор за сравнение, дори и двата термина да са променливи.
Ако само една от стойностите е известна, тогава тази известна стойност ще бъде присвоена на другата.
За Prolog няма значение дали стойността отдясно или отляво на = е известна; и в двата случая неизвестното ще придобие стойността на известното.
Да кажем променливата Fruit (fruit)неподписан. Подцелтаябълки=Плодове ще накара стойността ябълки да бъде присвоена на Плодове. Сега да предположим, че подцелтаПлод=X следва непосредствено предишната и че X е свободна променлива. Опит за изпълнение на тази подцел ще доведе до установяване на променлива X на ябълки.
Дори и термините Fruit и X да са променливи, Prolog присвоява (стойности) на недефинираната променлива на известна стойност. В много езици за програмиране присвояването става само под формата на присвояване на десен термин на ляв. Но в Prolog присвояването може да върви и в двете посоки.
Като последен пример разгледайте подцелтаX=портокали. Променливата X беше зададена на ябълки в резултат на предишната инициализация. Константата на портокалите също има известно значение. Тъй като и двете стойности са известни, Prolog проверява дали са равни. Полученият изразябълки=портокали е грешен. Следователно тази подцел се проваля и целта също се проваля.
След това неуспешно доказателство за целта, променливите Fruit и X стават нулеви.
Изучаването на поведението на оператора= при извършване на сравнение и присвояване е много полезно по две причини. Първо, операторът= се използва широко в програмирането на Prolog. Второ, и по-важно,операторът = се държи точно като подпрограми на вътрешния обединител, когато съпоставя цели и подцели с факти или програмни правила.
На променливите могат да се присвояват стойности по време на опити за постигане на целите и те също могат да бъдат сравнявани, за да се тества за равенство.
Резултатите от стойността се предават на други подцели, които използват съответните обекти по време на присвояване на стойност или сравнение на стойности.
Ако някоиподцелта е неуспешна или следващите подцели не използват стойностите на определените променливи, тогава тези променливи стават неоценени, т.е. стават отново свободни.