2016-12-04 7 views
5

Najpierw, gdy czytałem różne predykaty na temat Prolog, jak na przykład http_server, jest napisane tak: http_server(:Goal, +Options) co znaczy : i +? Czasami zapisywane jest również ?.
Po drugie, czasami widzę zmienne zadeklarowane z podkreśleniem przed nimi, takie jak _Request, mimo że nie ma żadnego innego Request, dlaczego tak jest?Co to oznacza w prologu?

Odpowiedz

7

W +, -, : itp sigile nazywane są deklaracje tryb. Opisują one oczekiwaną instancję argumentów predykatów, tj. Czy oczekuje się, że wywołasz predykat z niezwiązaną zmienną, instancją, itd. Nie są one całkowicie znormalizowane; tutaj jest opis konwencji dla SWI-Prolog: http://www.swi-prolog.org/pldoc/man?section=modes

W pierwszym przybliżeniu, o + argumentem jest wejście do orzecznika, ci mają zapewnić termin gruntowych. Argumentem - jest wyjściowy predykatu, predykat spróbuje ujednolicić go z terminem. Termin ? może być częściowo utworzony podczas wywołania, a predykat może go utworzyć. Argument : jest meta-argumentem, tj. Celem jest wywołanie przez predykat (na przykład w przypadku setof/3).

W przykładzie http_server(:Goal, +Options) powinieneś wywołać ten predykat z pierwszym argumentem powiązanym z celem, prawdopodobnie z nazwą predykatu. Drugi argument musi być utworzony, przypuszczalnie do listy, której format jest dokładniej opisany w dokumentacji. Jeśli wykonasz , nie, wywołaj ten predykat w ten sposób, na przykład, jeśli przekażesz niezwiązaną zmienną jako drugi argument, może pojawić się nieoczekiwane zachowanie lub błąd wystąpienia.

Jeśli chodzi o drugie pytanie (które lepiej byłoby być oddzielne), zmienna, która zaczyna się od podkreślenia, nazywa się anonimową zmienną . Każda taka zmienna może wystąpić tylko raz na klauzulę, z wyjątkiem samego siebie, z wyjątkiem _, która może wystąpić kilkakrotnie i odnosi się do oddzielnych zmiennych w każdym wystąpieniu.

Systemy Prolog zwykle emitują ostrzeżenie "singleton variable" dla zmiennych nieanonimowych, które występują tylko raz, ponieważ mogą to być literówki lub znak, że programista o czymś zapomniał. Używasz zmiennych anonimowych, aby wyrazić pogląd, że "coś tu musi być (np. Argument predykatu), ale nie obchodzi mnie, co to jest". W twoim przykładzie przypuszczalnie wywołujesz predykat, który ma argument "request", ale w twoim konkretnym przypadku nie dbasz o to żądanie.

+0

Dzięki, bardzo ładne wyjaśnienie. Nadal jest jedna rzecz, której nie rozumiem, dlaczego nazywam ją "_Request", a nie tylko '_'? Czy dla jasności jest to prośba? – Ferus

+1

Tak, tylko po to, aby nazwa zmiennej była bardziej wyrazista. –