Paradygmaty programowania/Test 14: Programowanie w logice w Prologu II

From Studia Informatyczne

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