>

Prolog의 새로운 프로그래밍입니다. 나는 프롤로그에서 순차적 미적분학의 규칙을 프로그램해야한다. 수식이 유효하면 코드는 true를, 유효하지 않으면 false를 반환해야합니다. 내 코드는 다음과 같습니다.

공식이 유효하면 true를 반환합니다.

그러나 유효하지 않은 수식으로 코드를 실행하면 끝나지 않으며 어떻게 해결할 수 있는지 모르겠습니다.

쿼리 -? sc([ ],[ (neg ((neg p)or neg (neg p)))]).  해당 수식이 유효하지 않기 때문에 false를 반환해야합니다.

이 문제에 대해 도움을 주셔서 감사합니다.


  • 답변 # 1

    분할 규칙에 오류가 있습니다. 또한 순열 규칙은 구조적 규칙입니다 :

    G, A, B, D |- C
    ---------------
    G, B, A, D |- C
    
    

    루프되지 않도록 코딩해야합니다. 그러나 이제는 정확히 일어날 수 있습니다. 간단한 트릭이 있습니다. 어쩌면 그것을 구현하고 싶을 수도 있습니다.

    다음은 정리 된 버전입니다.

    :- use_module(library(basic/lists)).
    sc([neg(A)|L],R) :- !, sc(L,[A|R]).
    sc(L,[neg(A)|R]) :- !, sc([A|L],R).
    sc(L,[or(A,B)|R]) :- !, sc(L,[A,B|R]).
    sc([or(A,B)|L],R) :- !, sc([A|L],R), sc([B|L],R).
    sc([A|L],R) :- atom(A), select(B,L,H), compound(B), !, sc([B,A|H],R).
    sc(L,[A|R]) :- atom(A), select(B,R,H), compound(B), !, sc(L,[B,A|H]).
    sc(L,R) :- member(A,L), member(A,R), !.
    
    

    여기에 몇 가지 실행이 있습니다 :

    Jekejeke Prolog 3, Runtime Library 1.3.5
    (c) 1985-2019, XLOG Technologies GmbH, Switzerland
    ?- sc([],[neg(or(neg(p),neg(neg(p))))]).
    No
    ?- sc([],[or(neg(p),neg(neg(p)))]).
    Yes
    
    

    비고 : 나는 정체성 규칙을 끝까지 옮겼다. 그래서 그것은 원자에만 부딪 칠 것이다. 고전 논리에 대한 역전 성 정리로 정당화 된 컷을 배치했습니다. 비논리적 인 문제가 발생하거나 다른 논리에서는 작동하지 않을 수 있습니다.

  • 답변 # 2

    :- use_module(library/basic/lists)).
    sc(I,D) :- \+(intersection(I,D,[])),!.
    sc([(neg F)|I],D) :- sc2(I,[F|D]),!.
    sc(I,[(neg F)|D]) :- sc2([F|I],D),!.
    sc(I,[(F1 or F2)|D]) :- union([F1,F2],D,D1),sc2(I,D1),!.
    sc([(F1 or F2)|I],D) :- sc2([F1|I],D),sc2([F2|I],D),!.
    sc2(I,D):-permutation(I,I1),permutation(D,D1),sc(I1,D1).
    
    

  • 이전 sap - A80은 SE80에서 잘 작동하지만 Z tcode에서는 잘 작동하지 않습니다
  • 다음 reactjs - 환경 변수를 설정 했는데도 Reg가 인식되지 않습니다