2016-06-27 24 views
7

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.

Odpowiedz

4

Istnieje kilka sposobów. Być może najłatwiej jest w tym przypadku po prostu ponownie opublikować zebrane ograniczenia rezydualne.

W tym przykładzie mamy:

 
?- 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(U, T), f(g(Z), Z)). 

Celem jest teraz znacznie prostsze!

Możesz zbierać pozostałe cele za pomocą copy_term/3 i call_residue_vars/2.

+0

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) –