HiLog는 Prolog에서“call”로 할 수없는 것을 추가합니까? [복제]
Prolog에 대한 Wikipedia 기사는 다음과 같이 말합니다.
Prolog의 고차 프로그래밍 스타일은 HiLog 및 λProlog에서 개척되었습니다.
HiLog 의 동기는 다음 과 같은 고차 조건자를 구현하는 기능을 포함합니다 maplist
.
maplist(F)([],[]).
maplist(F)([X|Xs],[Y|Ys]) <- F(X,Y), maplist(F)(Xs,Ys).
HiLog를 설명하는 논문은 프롤로그 만 있다고 가정 call/1
하지 call/3
.
그러나 Prolog (현재)에는 call/3
이므로 maplist
쉽게 구현할 수 있습니다.
maplist(_, [], []).
maplist(P, [X|Xs], [Y|Ys]) :- call(P, X, Y), maplist(P, Xs, Ys).
HiLog는 대부분 역사적 관심사입니까, 아니면 "고차"로직이 현재 Prolog에서 사용할 수있는 것보다 더 일반적입니까?
답변
위키에서
구문 적으로 HiLog는 엄격하게 1 차 로직을 확장하지만 HiLog는이 로직에 포함될 수 있습니다.
모든 HiLog 용어는 Prolog 용어로 번역 될 수 있습니다 ( HiLog : 고차 논리 프로그래밍의 기초-Weidong Chen, Michael Kifer, David S. Warren-1993 ). 따라서 어떤 의미에서는 프롤로그보다 일반적이지 않습니다.
논문에서 몇 가지 결론을 인용하겠습니다.
첫째, HiLog 프로그래밍은 더 많은 논리 프로그램을 논리적으로 만듭니다. 우리는 모두 Prolog 프로그래머에게 프로그램을 가능한 한 순수하게 만들고 Prolog의 비논리적 구성의 악을 피하도록 권고합니다. Prolog에서 술어와 함수 기호, 특히 술어 call / 1의 혼합은 비논리적이지만 HiLog에서는 완전히 논리적이며 일류 시민입니다. 따라서 HiLog에서 프로그래머는 call / l 사용을 피할 필요가 없으므로 순수한 논리 프로그램을 작성하는 작업에서 더 많은 유연성을 갖습니다.
둘째, HiLog가 단순히 Prolog의 구문 변형이라고 말할 수 있지만 메타 프로그래밍을 할 때 구문이 중요합니다. 메타 프로그래밍에서 구문은 조작 할 데이터 구조를 결정하므로 더 간단한 구문은 메타 프로그램이 훨씬 더 간단 할 수 있음을 의미합니다.
약간 모호하게 :
HiLog는 Prolog가 아니지만 (Prolog는 Prolog로 유지) 기본적으로 논리 기반 객체 지향 데이터베이스 인 Flora 에서 사용 됩니다. 자체 구문이 있으며 XSB Prolog에서 실행됩니다 .
내가 올바르게 이해한다면, HiLog의 아이디어는 술어 이름 위치에 변수를 허용함으로써 "고차"술어에 대한 정의 된 실용적인 구문을 갖는 것입니다. 이것이 두 maplist
예의 차이점 입니다.
이것은 이것이 2 차 논리 인 것처럼 보입니다 ( F
술어 G
가 일반적으로 술어와 관련되어 있는지 여부를 알아낼 방법이 없기 때문에 계산할 수 없거나 다루기 어려워집니다. 성공)하지만 구문 평등 (로 제한하여 1 일 주문 (계산 가능)까지 평평 F
하고 G
이름이 같은 조건이 경우 동일하다 foo/2
)하는 점 하나를 배포 할 수 있습니다 call/N
프롤로그 코드를 생성 할 수 있습니다.
그래서, 예, 현재 당신은 HiLog에서 한 줄의 문장이 될 수있는 Prolog의 진술을 표현하기 위해 후프를 뛰어 넘어야합니다 (하지만 이것에 대해 너무 깊이 이해하지는 않았지만). 그것은 C와 ... 어 ... 프롤로그의 차이입니다!
Prolog를 다양한 X-log로 확장 / 수정하는 다른 아이디어의 호스트와 유사하며, 모두 구현되지는 않았습니다 ( 여기 에서 개요 이미지를 만들려고했습니다 ), "HiLog 구문"(또는 이와 유사한 것)은 틈새 시장을 벗어나는 미래의 특수 X- 로그에서 찾을 수 있습니다.
댓글에 내 질문에 답 했으므로 여기에 게시하겠습니다.
HiLog에서 수행 할 수있는 작업 call
은 Prolog에서 수행 할 수 없습니다 . 예를 들면 다음과 같습니다.
다음과 같은 쿼리 :
?- X(dog, 55, Y).
다음과 같은 주장 :
foo(X, Y) :- Z(X), Z(Y(X)).
앞서 언급 한 HiLog 문서와 HiLog Wikipedia 페이지에서 언급했듯이 Prolog는 HiLog를 에뮬레이션 할 수 있습니다. 그러나이를 위해서는 전체 프로그램과 모든 쿼리를 단일 술어로 변환해야합니다.