Как проверить равенство в нескольких списках в Прологе

#prolog

Вопрос:

Я создал предложение для проверки того, возвращают ли 2 вызова функции func один и тот же вывод, возвращая значение true, если выходные данные одинаковы, возвращая значение false, если выходные данные не равны.

 same([Current|Rest], Max, Solution) :-
   NewMax is Max-1,
   Ans1 = func([Current|Rest], Max, Solution1),
   Ans2 =func([Current|Rest], NewMax, Solution),
   Ans1 = Ans2.  

Example outputs of func:
`
?- func([a], 2, X).
X = [a, b, d] ;
X = [a, f, i] ;
false.

?- func([a], 3, X).
X = [a, b, d] ;
X = [a, f, i] ;
false.

?- func([a], 4, X).
X = [a, b, d] ;
X = [a, f, i] ;
X = [a, f, i, j, m] ;
false.
 

Поэтому желаемый результат того же/3 будет:

 ?- same([a], 4, X).
false

?- same([a], 3, X).
true
 

Любая помощь была бы очень признательна.

Комментарии:

1. Если я понял вашу проблему, вы, возможно, захотите проверить findall/3 и between/3

2. Кроме того, почему вы пометили вопрос tree «и artificial-intelligence «?

3. Я попытался найти все, я не был уверен, как ограничить его только 2 записями. Чтобы попытаться прояснить это, я проверяю, является ли вывод функции([Список], Число, решение) одинаковым или нет, когда Число= Число и когда Число= Число -1. Спасибо

Ответ №1:

Ans1 = func([Current|Rest], Max, Solution1),

В прологе нет вызовов функций. Что означает эта строка, так это «объединить переменную Ans1 с термином func([Current|Rest], Max, Solution1) «. Это не означает что-то вроде «вызов func и возврат результата», потому что в прологе нет вызовов функций.

Если вы напишете эту строку как:

 func([Current|Rest], Max, Solution1),
 

затем func будет вызван предикат и объединит переменную Solution1 с некоторым термином. Это аналог «возврата значения» в Прологе.

Поэтому, если вы хотите позвонить func дважды и сравнить «возвращаемые значения» для равенства, вы можете сделать это:

 func([Current|Rest], Max, Solution1),
func([Current|Rest], NewMax, Solution2),
Solution1 = Solution2
 

Если вы хотите , чтобы это удалось только в том случае, если Solution1 = Solution2 , кроме того, вы хотите привязать переменную Solution к этому же значению, вы можете добавить строку:

 Solution = Solution1
 

в конце. Но также вы могли бы написать все это вот так:

 same([Current|Rest], Max, Solution) :-
   NewMax is Max-1,
   func([Current|Rest], Max, Solution),
   func([Current|Rest], NewMax, Solution).
 

Это не удастся, если два вызова func попытаются привязаться Solution к разным условиям. Это будет успешным, если они попытаются связать Solution себя едиными условиями.