Learn how easy it is to sync an existing GitHub or Google Code repo to a SourceForge project! See Demo

Close

play in CLIPS

Help
jkmuf
2009-12-21
2012-11-23
  • jkmuf
    jkmuf
    2009-12-21

    trere are 10 chips .   I need to reposition they to final-state . Something like that:
      

         (deffacts MAIN::initial-position
         (status (search-depth 1)
            (parent no-parent)
            (last-move no-move)
        (chips white black white black white black white black empty empty )
         ))
       

       
            (defrule SOLUTION::recognize-solution
          (declare (auto-focus TRUE))
          ?node <- (status (parent ?parent)                  
                           (last-move ?move)
                   (chips black black black black white white white white empty empty))
         
          =>
          (retract ?node)
          (assert (moves (id ?parent) (moves-list ?move))))
    the correct step is to reposition 2 not empty chips, that stay together with to empty chips….i tried to do it like that

        (defrule MAIN::move-alone
    ?node<-(status (search-depth ?num)  ;curent state of search
            (chips $?chip))
    ;?choise1<-(member empty  $?chip)
       ;?choise2<-(member ?c2&~empty  $?chip)       (member ?c2&~empty $?chip)
          =>
       (bind ?notempty1 (nth$ (- 1(nempty $?chip)) ?chip))  ;find color of first not empty chip
    (bind ?notempty2 (nth$  (nempty $?chip) ?chip))  ;find color of second not empty chip
    (bind ?notempty1pos (- 1(nempty $?chip))) ;find position of not empty chip
    (bind ?notempty2pos (nempty $?chip))

    (bind $?chip1 (replace$ ?chip  (member$ empty  ?chip) (member$ empty  ?chip) ?notempty1)) ; reposition chips
    (bind $?chip2 (replace$ ?chip1  (+ 1 (member$ empty  ?chip1)) (+ 1 (member$ empty  ?chip1) ?notempty2)))
    (bind $?chip3 (replace$ ?chip2  ?notempty1pos ?notempty2pos  empty))
    (duplicate ?node (search-depth (+ 1 ?num)) ;change curent state of search
                         (parent ?node)
      (last-move (member$ empty  ?chip) (nempty $?chip))
        (chips $?chip3)
    ))

    but  I don`t know how can I write function nempty, that return position of second not empty chip…
    help me please…. i will be thank you very much for any ideas for decision of this problem…..

     
  • jkmuf
    jkmuf
    2009-12-22

    I thing it will be something like that, but there is some mistake with circularity

        (deffunction nempty ( ?i $?chip)
                (if (and (or (eq (first$  ?chip) white)(eq (first$  ?chip) black))(or (eq (first$  (rest$ ?chip)) white)(eq (first$  (rest$ ?chip)) black)))
        then (return ?i)

        else  (nempty (+ 1 ?i) $?chip)))

     
  • Gary Riley
    Gary Riley
    2010-01-13

    CLIPS>
    (deffunction find-nth-occurrence (?n ?value ?list)
       (bind ?position (member$ ?value ?list))
       (if (or (not ?position)
               (= ?n 1))
         then
         (return ?position))

       (bind ?next (find-nth-occurrence (- ?n 1)
                                        ?value
                                        (subseq$ ?list (+ ?position 1) (length$ ?list))))
       (if ?next
          then
          (return (+ ?position ?next))
          else
          (return ?next)))
    CLIPS> (find-nth-occurrence 1 empty (create$ white black empty black black white white empty black empty))
    3
    CLIPS> (find-nth-occurrence 2 empty (create$ white black empty black black white white empty black empty))
    8
    CLIPS> (find-nth-occurrence 3 empty (create$ white black empty black black white white empty black empty))
    10
    CLIPS> (find-nth-occurrence 4 white (create$ white black empty black black white white empty black empty))
    FALSE
    CLIPS>

     
  • jkmuf
    jkmuf
    2010-01-19

    thank you very much for yuor comment, but I have one another question about this goal… I need find the answer with the help of 3 method of search : depth first search, breadth first search and someone width cost function, hill climbing fir example)….and I find answer with the help of first method…  I know advantage of CLIPS , that it perfect for "breadth first search" and the main idea of this searching, but all the same i can not cjmbine it… for example I know how i can do it with the help of prolog….maybe can someone  help me "translate" it for CLIPS?

    initial_state([white,black,white,black,white,black,white,black,empty,empty]).
    final_state([black,black,black,black,white,white,white,white,empty,empty]).
    main(Decision):-
        initial_state(State),
        breadth_search([s(State,[])],[],[],Decision),
        writeln(Decision).
    %CurentFront,NextFront,ListOfOpenState,-ListOfMovesFromCurentToFinalState
    breadth_search([s(State,Path)|_],_,_,Path):-
        final_state(State).
    breadth_search([s(State,Path)|Fr],NextFr,History,EndPath):-
            findall(State1-Move,(choise2(State,1,N,X,Y),move(X,Y,N,State,State1,Move)),NextMoves),
        next_fr_add(NextMoves,NextFr,NextFr1,History,Path),
        history_add(State,History,History1),
        breadth_search(Fr,NextFr1,History1,EndPath).
    
    breadth_search([],[],_,_):-
        !,
        fail.
    breadth_search([],NextFr,History,Move):-
        breadth_search(NextFr,[],History,Move).
    %MoveOfCurentState,CurentFront,AddingFront,PathToCurentState
    next_fr_add([ State-Move|NextMoves],NextFr,[s(State,[Move|Path])|NextFr1],History,Path):-
        not(member(State,History)),
        !,
        next_fr_add(NextMoves,NextFr,NextFr1,History,Path).
    next_fr_add([_|NextMoves],NextFr,NextFr1,History,Path):-
        next_fr_add(NextMoves,NextFr,NextFr1,History,Path).
    next_fr_add([],NextFr,NextFr,_,_).
    %State,History,AddingHistory
    history_add(State,History,History):-
        final_state(State),
        !.
    history_add(State,History,[State|History]).
    %criterion_function([S1,S2|State],I,Estimate):-
    %   S1=S2,
    %   I1 is I-1,
    %   criterion_function([S2|State],I1,Estimate).
    %criterion_function([S1,S2|State],I,Estimate):-
        %S1\=S2,
    %   criterion_function([S2|State],I,Estimate).
    %criterion_function([_],I,I).
    
    %+List,+Counter,-PositionOfX,-X,-Y
    choise2([X,Y|_],I,I,X,Y):-
        X\=empty,
        Y\=empty.
    choise2([_|Xs],I,N,X,Y):-
        I1 is I+1,
        choise2(Xs,I1,N,X,Y).
    %+X,+Y,+PositionOfX,+CurentState,-NextState,-Move
    move(X,Y,N,State,State1,N-A):-
        search_empty(State,1,A),
        rearrange(State,X,Y,A,InterimState),
        rearrange(InterimState,empty,empty,N,State1).
    %+list,+Counter,-PositionOfEmpty
    search_empty([E|_],I,I):-
        E=empty.
    search_empty([E|Es],I,N):-
        E\=empty,
        I1 is I+1,
        search_empty(Es,I1,N).
    %+ListOfCurentState,+Item1,+Item2,+Counter,-ListOfNewState
    rearrange([X|Xs],A,B,I,[X|Xn]):-
        I>1,
        I1 is I-1,
        rearrange(Xs,A,B,I1,Xn).
    rearrange([_,_|Xs],A,B,1,[A,B|Xs]).
    
     
  • jkmuf
    jkmuf
    2010-02-24

    How  can I do in my program function like setof or findall in prolog?

     
  • Gary Riley
    Gary Riley
    2010-03-04

    Forward chaining systems keep running until all position conclusions have been reached from available knowledge. The farmer's dilemma example program, for example, finds all of the possible solutions, rather than stopping when the first is found. Forward chaining systems are not driven in the same way as a backward chaining system such as prolog, so you're not going to find direct translations for functionality in one system that you can use in the other.