Skip to content

Commit

Permalink
Merge pull request #11 from /issues/10-merge-kb
Browse files Browse the repository at this point in the history
Issues/10 merge kb
  • Loading branch information
kyouko-taiga authored Feb 27, 2019
2 parents 0b70c2f + 6879b17 commit da78613
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
7 changes: 4 additions & 3 deletions Sources/LogicKit/KnowledgeBase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,11 @@ public struct KnowledgeBase: Hashable {

public static func + (lhs: KnowledgeBase, rhs: KnowledgeBase) -> KnowledgeBase {
var result = KnowledgeBase(knowledge: [])
for (name, terms) in lhs.predicates {
result.predicates[name] = terms
for name in lhs.predicates.keys.concatenated(with: rhs.predicates.keys) {
result.predicates[name] = lhs.predicates[name] ?? []
if let right = rhs.predicates[name] {
result.predicates[name]!.append(contentsOf: right)
let set = Set(result.predicates[name]!)
result.predicates[name]?.append(contentsOf: right.filter({ !set.contains($0) }))
}
}
result.literals = lhs.literals.union(rhs.literals)
Expand Down
37 changes: 37 additions & 0 deletions Tests/LogicKitTests/KnowledgeBaseTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
@testable import LogicKit
import XCTest

class KnowledgeBaseTests: XCTestCase {

func testMerge() {
let kb1: KnowledgeBase = [
.fact("foo", "bar"),
.rule("foo", .var("x")) {
.fact("foo", .var("x"))
},
.lit(12),
.lit(13),
]

let kb2: KnowledgeBase = [
.fact("foo", "bar"),
.rule("foo", .var("y")) {
.fact("foo", .var("y"))
},
.lit(12),
.lit(14),
]

let knowledge = Array(kb1 + kb2)
XCTAssert(knowledge.contains(.fact("foo", "bar")))
XCTAssert(knowledge.contains(.rule("foo", .var("x")) { .fact("foo", .var("x")) }))
XCTAssert(knowledge.contains(.rule("foo", .var("y")) { .fact("foo", .var("y")) }))
XCTAssert(knowledge.contains(.lit(12)))
XCTAssert(knowledge.contains(.lit(13)))
XCTAssert(knowledge.contains(.lit(14)))

XCTAssertEqual(knowledge.filter({ $0 == .fact("foo", "bar") }).count, 1)
XCTAssertEqual(knowledge.filter({ $0 == .lit(12) }).count, 1)
}

}

0 comments on commit da78613

Please sign in to comment.