Тестирование Пролога - PullRequest
7 голосов
/ 09 июля 2011

Я читал о том, насколько велики списки различий, и я надеялся протестировать некоторые примеры из книг. Но кажется, что вы не можете передавать списки в качестве входных данных так же, как, например, append ([1,2,3], [4,5], X), где X = [1,2,3, 4,5]. Как ни странно, ни одна книга, с которой я консультировался, никогда не упоминала об этом.

Я запускаю код на swipl и заинтересован в тестировании предиката разностного дополнения:

dapp(A-B,B-C,A-C).

и предикат "повернуть первый элемент списка":

drotate([H|T]-T1,R-S) :- dapp(T-T1,[H|L]-L,R-S).

Есть идеи, как я могу проверить эти предикаты в swipl?

Ответы [ 2 ]

7 голосов
/ 09 июля 2011

Попробуйте:

dapp([1,2,3|X] - X,[4,5,6] - [],Y - []).
drotate([1,2,3|X] - X,Y - []).

Y - ответ для обоих предикатов.

2 голосов
/ 01 февраля 2012

Определение drotate можно упростить:

dapp(A-B,B-C,A-C). 
drotate([H|T]-T1,R-S) :- % dapp(T-T1,[H|L]-L,R-S). 
       %% use the definition of dapp:
                         T=R, T1=[H|L], L=S. 

IOW, просто,

drotate([H|R]-[H|L],R-L).

Теперь любой список различий обычно записывается в виде пары, A-B. Таким образом, вызов drotate может быть drotate([1,2,3|Z]-Z,R-L) с намерением увидеть вывод в R-L переменных. Но сопоставив этот вызов с последним определением, мы получим Z=[1|L], т. Е. Логвар Z, предположительно неинстанцированный до вызова, инстанцируется им, фактически добавляя 1 в конец открытого списка [1,2,3|Z]-Z , превращая его в [1,2,3,1|L]-L. R просто указывается на 2-й элемент нового расширенного списка, сопоставляя [H|R] со списком.

?- drotate([1,2,3|Z]-Z,R-L).

Z = [1|_G345]
R = [2, 3, 1|_G345]
L = _G345 

Yes

Но это также может быть вызвано с действительно круговыми данными, A-A=[1,2,3|Z]-Z, drotate(A-Z,R-L):

?- A-A=[1,2,3|Z]-Z, drotate(A-Z,R-L).

A = [1, 2, 3, 1, 2, 3, 1, 2, 3|...]
Z = [1, 2, 3, 1, 2, 3, 1, 2, 3|...]
R = [2, 3, 1, 2, 3, 1, 2, 3, 1|...]
L = [2, 3, 1, 2, 3, 1, 2, 3, 1|...] 

Yes
...