Вопросы по теме 'unification'
разрешение унификации пролога
Почему это работает:
power(_,0,1) :- !.
power(X,Y,Z) :-
Y1 is Y - 1,
power(X,Y1,Z1),
Z is X * Z1.
И это дает исключение переполнения стека?
power(_,0,1) :- !.
power(X,Y,Z) :-
power(X,Y - 1,Z1),
Z is X * Z1.
1361 просмотров
schedule
08.03.2022
Сопоставление с образцом эквивалентных переменных в Haskell, например, в Prolog
В прологе мы можем сделать что-то вроде следующего:
myFunction a (a:xs) = ...
То есть, когда 1-й аргумент myFunction совпадает с первым элементом списка во 2-м аргументе, эта функция будет оцениваться как ... .
Теперь мой вопрос: как...
1401 просмотров
schedule
05.04.2022
Создать экземпляр переменной типа в Haskell
EDIT: Решено. Я не знал, что включение расширения языка в исходном файле не включает расширение языка в GHCi. Решение было :set FlexibleContexts в GHCi.
Недавно я обнаружил, что объявления типов в классах и экземплярах Haskell являются...
1007 просмотров
schedule
17.06.2022
Учитывая замену S и список Xs, как применить S к Xs
Предположим, у меня есть замена S и список Xs , где каждая переменная, встречающаяся в Xs , также встречается в S . Как мне найти список S(Xs) , т. е. список, полученный применением замены S к списку Xs .
Более конкретно, у меня есть...
135 просмотров
schedule
25.07.2022
Объединение и замена
В Haskell я определил полиморфный тип данных Subst a с одним конструктором S :: [(String, a)] -> Subst a следующим образом:
data Subst a where
S :: [(String, a)] -> Subst a
deriving (Show)
Я хочу определить функцию...
500 просмотров
schedule
22.06.2022
Ошибка типа в функции Haskell
Я написал функцию Haskell следующим образом:
shift :: Subst a -> Subst a
shift (S s) = [(x, (subst s' d)) | (x,d) <- s] where
s' = [(x,d) | (x,d) <- s, null (vars d)]
С таким типом данных data Subst a = S [(String,a)]
Я...
110 просмотров
schedule
16.07.2023
Почему двойное отрицание не связывается в Прологе
Скажем, у меня есть следующая теория:
a(X) :- \+ b(X).
b(X) :- \+ c(X).
c(a).
Он просто говорит истина, что, конечно, правильно, a(X) истинно, потому что нет b(X) (с отрицанием как конечный отказ). Поскольку есть только b(X) , если...
1180 просмотров
schedule
24.06.2023
Объединение расширенных терминов, двойное отрицание
Мне нужно ввести предикат, который позволит мне отрицать атомы. Пока у меня neg(Premise) :- \+ Premise. , что дает мне следующие результаты:
?- assert(a).
true.
?- a.
true.
?- neg(a).
false.
?- neg(neg(a)).
true.
В этом есть смысл, и все...
108 просмотров
schedule
15.05.2022
Унификация списка пролога
Я пытаюсь углубить свое понимание Пролога и того, как он обрабатывает объединение списков. Так что я застрял на этом примере, потому что знаю ответ, выполняя код, но не могу понять, как он работает.
[X,a,X,f(X,a)|Y] = [Z,Z|Y]
Ответ:
X=Z...
336 просмотров
schedule
08.02.2023
Унификация и неявное приведение параметра типа
class Base и class Ext extends Base . class B<T> с типизированным методом foo<T>(value:T)
Почему B<Base>.foo не принимает экземпляр B<Ext> (неявное понижение параметра типа?) по умолчанию?
Вот пример:...
92 просмотров
schedule
13.03.2023
is_list/1 и свободные переменные
Вот первое наблюдение:
?- is_list([]), is_list([_,_,_]).
true.
Вот еще одно наблюдение:
?- [] = _, [_,_,_] = _.
true.
Следовательно, зачем is_list/1 реализовывать так, чтобы
?- is_list(_).
false.
or
?- is_list([_|_])....
421 просмотров
schedule
04.09.2022
Правильная работа с множествами в Прологе
В Прологе кажется, что множества представлены списками.
Например, вот реализация union/3 из SWI-Prolog:
union([], L, L) :- !.
union([H|T], L, R) :-
memberchk(H, L), !,
union(T, L, R).
union([H|T], L, [H|R]) :-
union(T, L, R)....
1136 просмотров
schedule
21.03.2023
Какие алгоритмы использует компилятор Rust для определения переменных времени жизни?
fn foo<'a>(x: &'a i32, y: &'a i32) {}
fn main() {
let a = 123;
{
let b = 234;
foo(&a, &b);
}
}
Надеемся, что в приведенном выше коде &a и &b должны быть ссылки с разным временем...
880 просмотров
schedule
28.12.2022
Схемы рекурсии Haskell: одновременный обход двух структур
Я пытаюсь написать алгоритм объединения Робинсона, используя схемы рекурсии. Алгоритм объединения принимает два типа и выдает результат. Тип - это:
data TypeF a
= TypeApplication a a
| TypeVariable Name
deriving...
175 просмотров
schedule
18.09.2022
Реализация унификации и пропуска переменных
Я работаю над реализацией обычного алгоритма унификации обычным способом: рекурсивный спуск по деревьям выражений, попутно добавляя привязки переменных к хеш-таблице, выполняя проверку возникновения. В Java, как это бывает, используются функции...
261 просмотров
schedule
28.03.2022
Унификация структуры функций в миниканрене
Как определить унификация и включение в состав структуры признаков в миниканрене, если мы представляем структуры признаков со списками ?
Общее поведение будет примерно таким (я думаю):
(run* (q) (unifyo '(a b) '(a b) q))) => (a b)...
225 просмотров
schedule
01.07.2022
Алгоритм Куайна с односторонним объединением в Прологе
В новом выпуске SWI-Prolog 8.3.19 вводится односторонняя унификация внутри новых правил стиля Picat. Это могло быть долгожданным дополнением к любой системе Prolog. Мне было интересно, сможем ли мы переписать алгоритм Куайна
Реализация пролога...
76 просмотров
schedule
11.06.2022