Paradygmaty programowania/Test 14: Programowanie w logice w Prologu II
Test 14
Wpisany cel C można rozumieć jako klauzulę postaci:
0 :- C
1 :- C
C :- 0
C :- 1
Podstawienie pod zmienne w dwóch termach, sprawiające że termy te stają się identyczne, to:
rezolucja
term domknięty
unifikator
wspólny mianownik
Najogólniejszy unifikator dla f([1 | X]) i f([Y, 2, 3, Z]) to:
[X/1, Y/1, Z/[]]
[X/[2, 3], Y/1, Z/[]]
[X/[2, 3, Z], Y/1]
nie istnieje
Wybór najogólniejszego unifikatora jest jednoznaczny z dokładnością do:
nazw atomów
nazw funktorów
nazw zmiennych
jest bezwzględnie jednoznaczny
Spośród unifikatorów [X/f(Y)], [X/f(g(Z)), Y/g(Z)] i [X/f(g(a)), Y/g(a)] najogólniejszy jest:
[X/f(Y)]
[X/f(g(Z)), Y/g(Z)]
[X/f(g(a)), Y/g(a)]
wymienione unifikatory nie są porównywalne
Które pary termów nie dają się zunifikować?
f(X, g(a)) i f(a, g(X))
f(X, g(a)) i f(b, g(X))
f(g(h(X))) i Y
f(X) i f(Y)
Której klauzuli nie można użyć do wydzielenia głowy listy?
f(X, [X | Y]).
f(X, [X | _]).
f(X, Y, [X | Y]).
f(_, Y, [X | Y]).
Której klauzuli można użyć do sprawdzenia, że lista ma co najmniej dwa elementy?
f([_, _]).
f([_ | _]).
f([X, X | X]).
f([_, _ | _]).
Lista .(.(.([], []), []), []) to w zwykłym zapisie prologowym:
[[[]]]
[[[[]]]]
[[], []]
[[], [], []]
Term [X | X] daje się uzgodnić:
z dowolną niepustą listą
z listą dwuelementową o dwóch identycznych elementach
z listą dwuelementową postaci [[Y], Y]
tego termu nie da się uzgodnić z niczym