Szukaj…


Predefiniowane operatory

Predefiniowane operatory zgodnie z ISO / IEC 13211-1 i 13211-2:

Priorytet Rodzaj Operator Posługiwać się
1200 xfx :- -->
1200 fx :- ?- Dyrektywa, zapytanie
1100 xfy ;
1050 xfy ->
1000 xfy ','
900 fy \+
700 xfx = \\= Termin unifikacja
700 xfx == \\== @< @=< @> @>= Porównanie terminów
700 xfx =..
700 xfx is =:= =\= < > =< >= Ocena i porównanie arytmetyczne
600 xfy : Kwalifikacja modułu
500 yfx + - /\ \/
400 yfx * / div mod // rem << >>
200 xfx ** Moc pływaka
200 xfy ^ Zmienna kwantyfikacja, moc całkowita
200 fy + - \ Tożsamość arytmetyczna, negacja; bitowe uzupełnienie

Wiele systemów zapewnia dalszych operatorów jako rozszerzenie specyficzne dla implementacji:

Priorytet Rodzaj Operator Posługiwać się
1150 fx dynamic multifile discontiguous initialization Standardowe dyrektywy
1150 fx mode public volatile block meta_predicate
900 fy spy nospy

Deklaracja operatora

W Prolog operatory niestandardowe można zdefiniować za pomocą op/3 :

op(+Precedence, +Type, :Operator)

  • Ogłasza, że operator jest operatorem typu z pierwszeństwem. Operator może być również listą nazw, w którym to przypadku wszystkie elementy listy zostaną zadeklarowane jako identyczne operatory.

  • Pierwszeństwo jest liczbą całkowitą od 0 do 1200, gdzie 0 usuwa deklarację.

  • Typ stanowi jeden spośród: xf , yf , xfx , xfy , yfx , fy lub fx gdzie f oznacza pozycję funktora a x i y oznaczają pozycje argumentów. y oznacza termin o pierwszeństwie niższym lub równym pierwszeństwu funktora, natomiast x oznacza ściśle niższy priorytet.

    • Prefiks: fx , fy
    • Infix: xfx (bez asocjacji), xfy (prawy yfx ), yfx (lewy yfx )
    • Postfiks: xf , yf

Przykładowe użycie:

:- op(900, xf, is_true).

X_0 is_true :-
  X_0.

Przykładowe zapytanie:

?- dif(X, a) is_true.
dif(X, a).

Zamawianie terminu

Dwa warunki można porównać za pomocą standardowego zamówienia:

zmienne @ <liczby @ <atomy @ <łańcuchy @ <struktury @ <listy

Uwagi:

  • Struktury porównują alfabetycznie najpierw przez funktor, potem przez arity, a na koniec przez porównanie każdego argumentu.

  • Listy najpierw porównywane są według długości, a następnie każdego elementu.

Zamów operatora Udaje się, jeśli
X @ <Y X jest mniejsze niż Y w standardowej kolejności
X @> Y X jest większy niż Y w standardowej kolejności
X @ = <Y X jest mniejsze lub równe Y w standardowej kolejności
X @> = Y X jest większy lub równy Y w standardowej kolejności

Przykładowe zapytania:

?- alpha @< beta.
true.

?- alpha(1) @< beta.
false.

?- alpha(X) @< alpha(1).
true.

?- alpha(X) @=< alpha(Y).
true.

?- alpha(X) @> alpha(Y).
false.

?- compound(z) @< compound(inner(a)).
true.

Równość terminów

Operator równości Udaje się, jeśli
X = Y X można zunifikować z Y
X \ = Y X nie może być zunifikowany z Y
X == Y X i Y są identyczne (tzn. Łączą się bez występowania zmiennych powiązań)
X \ == Y X i Y nie są identyczne
X =: = Y X i Y są arytmetycznie równe
X = \ = Y X i Y nie są równe arytmetycznie


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow