def transversal_yield_lv(sets: List[PySet], transversal: Tuple[PyValue, PyValue, PyValue]): """ transversal is a tuple of length len(sets). Initially it consists of uninstaniated PyValues. When all the PyValues are instantiated, it is yielded as the answer. """ remaining_indices = uninstantiated_indices_lv(transversal) if not remaining_indices: yield transversal else: if propagate: # If we are propagating, we will have removed used values from all the sets. # If any of those sets are now empty but are associated with # an uninstantiated position in transversal, fail; empty_sets = [sets[indx].is_empty() for indx in remaining_indices] if any(empty_sets): return None next_index = min(remaining_indices, key=lambda indx: indx if not smallest_first else len(sets[indx])) # T_next is the PyValue to be instantiated this time around. T_next = transversal[next_index] used_values = PyList([transversal[i] for i in range(len(transversal)) if i not in remaining_indices]) for _ in member(T_next, sets[next_index]): for _ in fails(member)(T_next, used_values): new_sets = sets if not propagate else [set.discard(T_next) for set in sets] yield from transversal_yield_lv(new_sets, transversal)
def transversal_yield_lv(sets: List[PyList], so_far: PyList, Answer: Var): print(f'sets/[{", ".join([str(S) for S in sets])}]; so_far_reversed/{reversed(so_far)}') if not sets: yield from unify(reversed(so_far), Answer) else: [S, *Ss] = sets X = Var( ) for _ in member(X, S): for _ in fails(member)(X, so_far): yield from transversal_yield_lv(Ss, PyList([X]) + so_far, Answer)
def transversal_yield_lv(Sets: List[PyList], Partial_Transversal: PyList, Complete_Transversal: Var): print( f'Sets/[{", ".join([str(S) for S in Sets])}]; Partial_Transversal/{Partial_Transversal}' ) if not Sets: yield from unify(Partial_Transversal, Complete_Transversal) else: (S, Ss) = (Sets[0], Sets[1:]) Element = Var() for _ in member(Element, S): for _ in fails(member)(Element, Partial_Transversal): yield from transversal_yield_lv( Ss, Partial_Transversal + PyList([Element]), Complete_Transversal)
def tnvsl_dfs_gen_lv(sets, tnvsl): var_indxs = uninstan_indices_lv(tnvsl) if not var_indxs: yield tnvsl else: empty_sets = [sets[indx].is_empty() for indx in var_indxs] if any(empty_sets): return None nxt_indx = min(var_indxs, key=lambda indx: len(sets[indx])) used_values = PyList( [tnvsl[i] for i in range(len(tnvsl)) if i not in var_indxs]) T_Var = tnvsl[nxt_indx] for _ in member(T_Var, sets[nxt_indx]): for _ in fails(member)(T_Var, used_values): new_sets = [set.discard(T_Var) for set in sets] yield from tnvsl_dfs_gen_lv(new_sets, tnvsl)
def clue_2(self, Stdnts): """ Emmy studies either Math or Bio. """ # Create Major as a local logic variable. Major = Var() for _ in member(Stdnt(name='Emmy', major=Major), Stdnts): yield from member(Major, PyList(['Math', 'Bio']))
def clue_13(self, Houses: SuperSequence): """ 13. The Japanese smoke Parliament. """ yield from member(House(nationality='Japanese', smoke='Parliament'), Houses)
def clue_12(self, Houses: SuperSequence): """ 12. The Lucky smokers drink juice. """ yield from member(House(drink='juice', smoke='Lucky'), Houses)
def clue_7(self, Houses: SuperSequence): """ 7. They smoke Kool in the yellow house. """ yield from member(House(smoke='Kool', color='yellow'), Houses)
def clue_6(self, Houses: SuperSequence): """ 6. The Old Gold smokers have snails. """ yield from member(House(smoke='Old Gold', pet='snails'), Houses)
def clue_3(self, Houses: SuperSequence): """ 3. They drink coffee in the green house. """ yield from member(House(drink='coffee', color='green'), Houses)
def clue_2(self, Houses: SuperSequence): """ 2. The Spanish have a dog. """ yield from member(House(nationality='Spanish', pet='dog'), Houses)
def clue_1(self, Houses: SuperSequence): """ 1. The English live in the red house. """ yield from member(House(nationality='English', color='red'), Houses)
def clue_2(self, Students: SuperSequence): """ 2. Amy studies either Philosophy or English. """ # Create Major as a local logic variable. Major = PyValue() for _ in member(Student(name='Amy', major=Major), Students): yield from member(Major, self.ListType(['Philosophy', 'English']))
lambda: unify_pairs([(Xs, emptyLinkedList), (Ys, Zs)]), # Clause 2. lambda: forall([ lambda: unify_pairs([(Xs, LinkedList((XZ_Head, Xs_Tail))), (Zs, LinkedList((XZ_Head, Zs_Tail)))]), lambda: append(Xs_Tail, Ys, Zs_Tail) ]) ]): yield if __name__ == '__main__': print(emptyLinkedList) E = PyValue(3) for _ in member(E, emptyLinkedList): print(f'Error: should not get here.') A = LinkedList((Var(), Var())) A112 = A[4:11:2] A37 = A[3:7] print(f'\nA: {A}\nA[3:7]: {A37}\nA[4:11:2]: {A112}') for _ in unify(A37, LinkedList('ABCD')): print(f'\nA: {A}\nA[3:7]: {A37}\nA[4:11:2]: {A112}') print() print(f'A[:4]: {A[:4]}') A_tail = A.tail() print(f'A.tail()[:3]: {A_tail[:3]}') print(f'A.tail().tail()[:2]: {A.tail().tail()[:2]}')
def clue_4(self, Houses: SuperSequence): """ 4. The Ukrainians drink tea. """ yield from member(House(nationality='Ukrainians', drink='tea'), Houses)
def zebra_problem(Houses): for _ in forall([ # 1. The English live in the red house. lambda: member(House(nationality='English', color='red'), Houses), # lambda: print_SF(f'After 1: {Houses}', 'Succeed'), # 2. The Spanish have a dog. lambda: member(House(nationality='Spanish', pet='dog'), Houses), # lambda: print_SF(f'After 2: {Houses}', 'Succeed'), # 3. They drink coffee in the green house. lambda: member(House(drink='coffee', color='green'), Houses), # lambda: print_SF(f'After 3: {Houses}', 'Succeed'), # 4. The Ukrainians drink tea. lambda: member(House(nationality='Ukrainians', drink='tea'), Houses ), # lambda: print_SF(f'After 4: {Houses}', 'Succeed'), # 5. The green house is immediately to the right of the white house. lambda: is_contiguous_in( [House(color='white'), House(color='green')], Houses), # lambda: print_SF(f'After 5: {Houses}', 'Succeed'), # 6. The Old Gold smokers have snails. lambda: member(House(smoke='Old Gold', pet='snails'), Houses), # lambda: print_SF(f'After 6: {Houses}', 'Succeed'), # 7. They smoke Kool in the yellow house. lambda: member(House(smoke='Kool', color='yellow'), Houses), # lambda: print_SF(f'After 7: {Houses}', 'Succeed'), # 8. They drink milk in the middle house. # Note the use of a slice. Houses[2] picks the middle house. lambda: unify(House(drink='milk'), Houses[2]), # lambda: print_SF(f'After 8: {Houses}', 'Succeed'), # 9. The Norwegians live in the first house on the left. lambda: unify(House(nationality='Norwegians'), Houses.head()), # lambda: print_SF(f'After 9: {Houses}', 'Succeed'), # 10. The Chesterfield smokers live next to the fox. lambda: next_to(House(smoke='Chesterfield'), House(pet='fox'), Houses), # lambda: print_SF(f'After 10: {Houses}', 'Succeed'), # 11. They smoke Kool in the house next to the horse. lambda: next_to(House(smoke='Kool'), House(pet='horse'), Houses), # lambda: print_SF(f'After 11: {Houses}', 'Succeed'), # 12. The Lucky smokers drink juice. lambda: member(House(drink='juice', smoke='Lucky'), Houses), # lambda: print_SF(f'After 12: {Houses}', 'Succeed'), # 13. The Japanese smoke Parliament. lambda: member(House(nationality='Japanese', smoke='Parliament'), Houses), # lambda: print_SF(f'After 13: {Houses}', 'Succeed'), # 14. The Norwegians live next to the blue house. lambda: next_to(House(nationality='Norwegians'), House(color='blue' ), Houses), # lambda: print_SF(f'After 14: {Houses}', 'Succeed'), # Fill in unmentioned properties. lambda: members([House(pet='zebra'), House(drink='water')], Houses), ]): yield
=> [1, 4, 3] """ """ transversal_prolog(sets, so_far, _Answer) :- reverse(so_far, so_far_reversed), writeln('sets'/sets;' so_far_reversed'/so_far_reversed), fail. transversal_prolog([], so_far, Answer) :- reverse(so_far, Answer), format(' '), writeln('Answer '=Answer), nl. transversal_prolog([S|Ss], so_far, Answer) :- member(X, S), \+ member(X, so_far), transversal_prolog(Ss, [X|so_far], Answer). transversal_prolog(Sets, So_Far, _Answer) :- reverse(So_Far, So_Far_Reversed), writeln('Sets'/Sets;' So_Far_Reversed'/So_Far_Reversed), fail. transversal_prolog([], So_Far, Answer) :- reverse(So_Far, Answer),