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
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.
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
Tak, tylko po to, aby nazwa zmiennej była bardziej wyrazista. –