Тестирование Пролога

Я читал о том, насколько велики списки различий, и я надеялся протестировать некоторые примеры из книг. Но кажется, что вы не можете передавать списки в качестве входных данных точно так же, как, например, 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
Другие вопросы по тегам