OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-atomspace / tests / query / unify-test.scm

228 lines · scm ref:
#! /usr/bin/env guile
-s
!#
;
; unify-test.scm -- Port of UnifyTest.cxxtest
;
; Unfinished, under construction!
;
; UnifyTest::test_unify_unordered_5 actually fails. See below. #3016
;
; So, here's the deal:
; (Unify A B) is more or less the same thing as
; (Meet (Identical A B)) and because this is "more or less" the case,
; that is what this unit test tests. However... There are some
; conceptual differences. Unify allows the form:
;
;   (Unify
;      (VariableList left-vars...)
;      (VariableList right-vars..)
;      left-expr
;      right-expr)
;
; where left-vars... are the things to be taken as variables in left-expr.
; There's nothing like this for IdenticalLink or MeetLink. We can almost
; get the same thing by writing
;
;   (Meet
;      (VariableList left-vars... right-vars..)
;      (Identical left-expr right-expr))
;
; except that this can fail if (Variable "$X") apprears in left-vars,
; and also appears in right-expr, but not in right-vars. There is no
; way to handle this case in any kind of easy or natural way using
; MeetLink. And that is how Unify is different from (Meet (Identical ..))
;
; Ignoring this critical difference, this is a port of UnifyTest.cxxtest
; that "does the same thing", ignoring the subtleties above.

(use-modules (opencog))
(use-modules (opencog test-runner))

; Populate AtomSpace with test data.
(Inheritance (Concept "A") (Concept "B"))

(opencog-test-runner)

; --------------------------------------
; skip because its trivial: UnifyTest::test_unify_basic_1
; skip because its trivial: UnifyTest::test_unify_basic_2
; skip because its trivial: UnifyTest::test_unify_basic_3
; --------------------------------------
(test-begin "UnifyTest::test_unify_basic_4")
(define tub4
	(cog-execute!
		(CollectionOf (Meet
			(VariableList (Variable "$X") (Variable "$Y"))
			(Identical
				(Inheritance (Variable "$X") (Concept "B"))
				(Inheritance (Concept "A") (Variable "$Y")))))))

(format #t "Got ~A\n" tub4)
(test-assert "UnifyTest::test_unify_basic_4"
	(equal? tub4
		(Set (List (Concept "A") (Concept "B")))))

(test-end "UnifyTest::test_unify_basic_4")

; --------------------------------------
(test-begin "UnifyTest::test_unify_basic_5")
(define tub5
	(cog-execute!
		(CollectionOf (Meet
			(Variable "$X")
			(Identical
				(Inheritance (Variable "$X") (Variable "$Y"))
				(Inheritance (Concept "A") (Variable "$Y")))))))

(format #t "Got ~A\n" tub5)
(test-assert "UnifyTest::test_unify_basic_5"
	(equal? tub5
		(Set (Concept "A"))))

(test-end "UnifyTest::test_unify_basic_5")

; --------------------------------------
; skip because its trivial: UnifyTest::test_unify_basic_6
; skip because its trivial: UnifyTest::test_unify_basic_7
; --------------------------------------
(test-begin "UnifyTest::test_unify_basic_8")
(define tub8
	(cog-execute!
		(CollectionOf (Meet
			(VariableList (Variable "$X") (Variable "$Y"))
			(Identical
				(Inheritance (Variable "$X") (Variable "$Y"))
				(Inheritance (Concept "A") (Variable "$Z")))))))

(format #t "Got ~A\n" tub8)
(test-assert "UnifyTest::test_unify_basic_8"
	(equal? tub8
		(Set (List (Concept "A") (Variable "$Z")))))

(test-end "UnifyTest::test_unify_basic_8")

; --------------------------------------
; Stub out. Throws error
;  The variable (VariableNode "$Y") does not appear (unquoted) in any clause!
;;;(test-begin "UnifyTest::test_unify_undeclared_var_1")
;;;(define tuuv1
;;;	(cog-execute!
;;;		(Meet
;;;			(Variable "$Y")
;;;			(Identical
;;;				(Variable "$X")
;;;				(Concept "A")))))
;;;
;;;(format #t "Got ~A\n" tuuv1)
;;;(test-assert "UnifyTest::test_unify_undeclared_var_1"
;;;	(equal? tuuv1 (Set)))
;;;
;;;(test-end "UnifyTest::test_unify_undeclared_var_1")

; --------------------------------------
; Stub out. Throws error
;  The variable (VariableNode "$Y") does not appear (unquoted) in any clause!
; Even if we didn't get this error, there is now a conceptual issue.
; Unify reports a result: it says that (Variable "$X") and (Variable "$X")
; are the same, because they are constants, and constant variables are
; by definition alpha-equivalent.
; The problem here is that we have no way to even report this result.
; So port this test to an alternate form, below.
;;;(test-begin "UnifyTest::test_unify_undeclared_var_2")
;;;(define tuuv2
;;;	(cog-execute!
;;;		(Meet
;;;			(Variable "$Y")
;;;			(Identical
;;;				(Variable "$X")
;;;				(Variable "$Z")))))
;;;
;;;(format #t "Got ~A\n" tuuv2)
;;;(test-assert "UnifyTest::test_unify_undeclared_var_2"
;;;	(equal? tuuv2 (Set)))
;;;
;;;(test-end "UnifyTest::test_unify_undeclared_var_2")

(test-begin "UnifyTest::test_unify_undeclared_var_2_alt")
(define tuuv2
	(cog-execute!
		(CollectionOf (Query
			(Variable "$X")
			(Identical
				(Variable "$X")
				(Variable "$Z"))
			;; two implicands
			(Quote (Variable "$X"))
			(Variable "$X")))))

(format #t "Got ~A\n" tuuv2)
(test-assert "UnifyTest::test_unify_undeclared_var_2_alt"
	(equal? tuuv2
		(Set (List (Variable "$X") (Variable "$Z")))))

(test-end "UnifyTest::test_unify_undeclared_var_2_alt")
; --------------------------------------
; skip because its trivial: UnifyTest::test_unify_undeclared_var_3
; --------------------------------------
; Going to skip test_unify_vardecl_1 thru 5.
; These all seem to want to have the form
;   (Identical
;      (Clause (VariableList left-vars...) left-expr)
;      (Clause (VariableList right-vars..) right-expr))
; which is not a natural form that is supported. One "easy" fix would
; be to rewrite the above as
;   (Meet
;      (VariableList left-vars... right-vars..)
;      (Identical left-expr right-expr))
; but I think that violates the "spirit" of the idea, which is to
; keep the left and right vars disjoint.
; --------------------------------------
; Going to skip test_unify_cyclic_dependence_1 thru 4
; They seem to be boring. Not clear why these matter.
; --------------------------------------
; Skip some more, too, they seem boring ...
; --------------------------------------
(test-begin "UnifyTest::test_unify_unordered_2")
(define tun2
	(cog-execute!
		(CollectionOf (Meet
			(Variable "$Y")
			(Identical
				(Unordered (Concept "A") (Concept "B"))
				(Unordered (Concept "A") (Variable "$Y")))))))

(format #t "Got ~A\n" tun2)
(test-assert "UnifyTest::test_unify_unordered_2"
	(equal? tun2 (Set (Concept "B"))))

(test-end "UnifyTest::test_unify_unordered_2")
; --------------------------------------
; Skip cause its boring: UnifyTest::test_unify_unordered_3
; Skip cause its boring: UnifyTest::test_unify_unordered_4
; --------------------------------------
(test-begin "UnifyTest::test_unify_unordered_5")
(define tun5
	(cog-execute!
		(CollectionOf (Meet
			(VariableList (Variable "$X") (Variable "$Y"))
			(Identical
				(Unordered (Concept "A") (Concept "A") (Concept "B") (Concept "B"))
				(Unordered (Concept "A") (Concept "B") (Variable "$X") (Variable "$Y")))))))

(define tune5
	(Set
		(List (Concept "A") (Concept "B"))
		(List (Concept "B") (Concept "A"))))

(format #t "Got ~A\n" tun5)
(format #t "Expected ~A\n" tune5)

; This test fails! Yikes! See issue #3016
; (test-assert "UnifyTest::test_unify_unordered_5" (equal? tun5 tune5))

(test-end "UnifyTest::test_unify_unordered_5")
; --------------------------------------

(opencog-test-end)