Тестирование Пролога
Я читал о том, насколько велики списки различий, и я надеялся протестировать некоторые примеры из книг. Но кажется, что вы не можете передавать списки в качестве входных данных точно так же, как, например, 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 ответа
Пытаться:
dapp([1,2,3|X] - X,[4,5,6] - [],Y - []).
drotate([1,2,3|X] - X,Y - []).
Y является ответом для обоих предикатов.
Определение 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.
Просто,
drotate([H|R]-[H|L],R-L).
Теперь любой список различий обычно записывается в виде пары, A-B
, Так что призыв к drotate
возможно drotate([1,2,3|Z]-Z,R-L)
с намерением увидеть вывод в R-L
переменные. Но сопоставив этот вызов с последним определением, мы получим Z=[1|L]
то есть logvar 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