Istnieje wiele szumu wokół ograniczenia dif/2, szczególnie jako ratunek dla niektórych nie-deklaratywności (\ =)/2 i (\ ==)/2. Ta nie-deklaratywność jest często określana jako niemonotoniczność i podano przykłady nieproblemiczności.Jak zweryfikować przemienność z wykorzystaniem ograniczenia dif/2?
Ale jaki byłby środek do sprawdzenia, czy przypadki testowe z dif/2 są przemienne. Oto meta wyjaśnienie, co chcę zrobić:
robię test przemienności i chcę sondować, że oba warianty dają ten sam rezultat:
?- A, B. -- versus -- ?- B, A.
więc zazwyczaj można sprawdź monotoniczność, jeśli sprowadza się to do sprawdzenia komutatywności, z wbudowanym predykatem (==)/2. Ponieważ ten predykat jest zgodny z instancjonowanymi zmiennymi.
Ale jeśli testujesz sprawy, które powodują ograniczenia, call_with_residue/2 to za mało, musisz także mieć równe ograniczenia. Które mogą być trudne, jak w poniższym przykładzie:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.23)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
?- dif(f(X,X),f(a(U,g(T)),a(g(Z),U))), X=a(g(Z),U).
X = a(g(Z), U),
dif(f(a(g(Z), U), U, Z, U, T), f(a(U, g(T)), g(Z), T, g(Z), Z)).
?- X=a(g(Z),U), dif(f(X,X),f(a(U,g(T)),a(g(Z),U))).
X = a(g(Z), U),
dif(f(U, T), f(g(Z), Z)).
Wszelkie pomysły jak postępować?
Zastrzeżone, jego pułapka:
Nie popieramy testowanie przemienności jako dobrą metodę badania, gdzie można oddzielić dobre i złe predykaty w porównaniu ze specyfikacją. Ponieważ zazwyczaj zarówno dobre, jak i złe predykaty mogą nie mieć problemów z komutatywnością.
Używam testowania komutatywności jako pojazdu, aby dowiedzieć się o metodach równości dif/2 wiązań. Równość tę można następnie wykorzystać w bardziej tradycyjnych przypadkach testowych jako punkt weryfikacji.
Ale czy mogę również zautomatyzować repost z call_residue_vars/2. Nie próbowałem. I to prawdopodobnie tylko połowa rachunku. Jeśli są prostsze, czy możesz w jakiś sposób porównać ograniczenia? (Te prostsze nie muszą wyglądać tak samo) –