コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
0
ファイル: transversals.py プロジェクト: SamSunshine/pylog
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)
コード例 #4
0
ファイル: transversals.py プロジェクト: RussAbbott/pylog_FD
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)
コード例 #5
0
 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']))
コード例 #6
0
ファイル: zebra_problem.py プロジェクト: RussAbbott/FD_Solver
 def clue_13(self, Houses: SuperSequence):
     """ 13. The Japanese smoke Parliament. """
     yield from member(House(nationality='Japanese', smoke='Parliament'),
                       Houses)
コード例 #7
0
ファイル: zebra_problem.py プロジェクト: RussAbbott/FD_Solver
 def clue_12(self, Houses: SuperSequence):
     """ 12. The Lucky smokers drink juice. """
     yield from member(House(drink='juice', smoke='Lucky'), Houses)
コード例 #8
0
ファイル: zebra_problem.py プロジェクト: RussAbbott/FD_Solver
 def clue_7(self, Houses: SuperSequence):
     """ 7. They smoke Kool in the yellow house. """
     yield from member(House(smoke='Kool', color='yellow'), Houses)
コード例 #9
0
ファイル: zebra_problem.py プロジェクト: RussAbbott/FD_Solver
 def clue_6(self, Houses: SuperSequence):
     """ 6. The Old Gold smokers have snails. """
     yield from member(House(smoke='Old Gold', pet='snails'), Houses)
コード例 #10
0
ファイル: zebra_problem.py プロジェクト: RussAbbott/FD_Solver
 def clue_3(self, Houses: SuperSequence):
     """ 3. They drink coffee in the green house. """
     yield from member(House(drink='coffee', color='green'), Houses)
コード例 #11
0
ファイル: zebra_problem.py プロジェクト: RussAbbott/FD_Solver
 def clue_2(self, Houses: SuperSequence):
     """ 2. The Spanish have a dog. """
     yield from member(House(nationality='Spanish', pet='dog'), Houses)
コード例 #12
0
ファイル: zebra_problem.py プロジェクト: RussAbbott/FD_Solver
 def clue_1(self, Houses: SuperSequence):
     """ 1. The English live in the red house.  """
     yield from member(House(nationality='English', color='red'), Houses)
コード例 #13
0
 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']))
コード例 #14
0
ファイル: linked_list.py プロジェクト: jungsoolim77/pylog
            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]}')
コード例 #15
0
ファイル: zebra_problem.py プロジェクト: RussAbbott/FD_Solver
 def clue_4(self, Houses: SuperSequence):
     """ 4. The Ukrainians drink tea. """
     yield from member(House(nationality='Ukrainians', drink='tea'), Houses)
コード例 #16
0
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
コード例 #17
0
                                =>  [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),