#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
себя едиными условиями.