# Can Metatheory.jl work functional equal to Prolog?

**URL:** <https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185>\
**Category:** Specific Domains\
**Tags:** question, package\
**Created:** [February 28, 2022, 1:55pm UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185 "2022-02-28T13:55:53Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Junars](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/junars/32/16094_2.png) [@Junars](https://discourse.julialang.org/u/Junars)\
**Post date:** [February 28, 2022, 1:55pm UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185/1 "2022-02-28T13:55:53Z")

</div>

I’m rewriting a `Reasoning System` using Julia. The system has many rules written in `Prolog`, I want to use these existing [prolog rules](https://cis.temple.edu/~pwang/Implementation/NAL/nal.pl), because they are declarative and could make the whole system easy to debug it’s control mechanism without care much about its `reasoning` process.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [February 28, 2022, 6:18pm UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185/2 "2022-02-28T18:18:32Z")

</div>

In theory.

---

<div class="post-metadata">

**Author:** ![goerch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerch/32/29122_2.png) [@goerch](https://discourse.julialang.org/u/goerch)\
**Post date:** [February 28, 2022, 6:36pm UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185/3 "2022-02-28T18:36:58Z")

</div>

Sounds like a warning (or a play of words).

---

<div class="post-metadata">

**Author:** ![Junars](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/junars/32/16094_2.png) [@Junars](https://discourse.julialang.org/u/Junars)\
**Post date:** [February 28, 2022, 11:24pm UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185/4 "2022-02-28T23:24:44Z")

</div>

yeah, the reasoning system does syllogism.  
It has some rules like:

```julia
# two premises, one or more conclusions.
{M --> P, S --> M} |- S --> P # deduction
{S --> M, M --> P} |- S --> P, P --> S, P <-> S # exemplification
{S --> M, P --> M} |- (&,S,P) --> M

# translate into prolog style
infer(inheritance(S,M), inheritance(M,P), inheritance(S,P)).

```

I’m trying to replace `Julog.jl` with `Metatheory.jl` in the system that I’m rewritting in `Julia`.

---

<div class="post-metadata">

**Author:** ![Junars](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/junars/32/16094_2.png) [@Junars](https://discourse.julialang.org/u/Junars)\
**Post date:** [February 28, 2022, 11:27pm UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185/5 "2022-02-28T23:27:06Z")

</div>

Well, I think this might be over my head.

---

<div class="post-metadata">

**Author:** ![Junars](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/junars/32/16094_2.png) [@Junars](https://discourse.julialang.org/u/Junars)\
**Post date:** [March 1, 2022, 12:38am UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185/6 "2022-03-01T00:38:41Z")

</div>

Experiment:

```julia
abstract type MyTerm end
struct Inheritance <: MyTerm
    comps::Vector{MyTerm}
end

struct Similarity <: MyTerm
    comps::Vector{MyTerm}
end

struct Word <: MyTerm
    sym::Symbol
end

inheritance(a, b) = Inheritance([Word(a), Word(b)])
similarity(a, b) = Similarity([Word(a), Word(b)])

syllogism = @theory S M P begin
    inheritance(S, M) + inheritance(M, P) => inheritance(S, P)
    inheritance(S, M) + inheritance(M, P) => Inheritance([Word(P), Word(S)]);
    inheritance(S, M) + inheritance(M, P) => Similarity([Word(S), Word(P)]);
    # prolog-like
    infer(inheritance(S, M), inheritance(M, P)) --> similarity(P, S);
    # more rules ...
end

rewrite(:(inheritance(s, m) + inheritance(m, p)), syllogism)

```

Great! But it seems only rewrite once.

```nohighlight
julia> rewrite(:(inheritance(s, m) + inheritance(m, p)), syllogism)
Inheritance(MyTerm[Word(:s), Word(:p)])

```

I need to learn more about `Metatheory.jl` ! 😀

---

<div class="post-metadata">

**Author:** ![CameronBieganek](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cameronbieganek/32/6915_2.png) [@CameronBieganek](https://discourse.julialang.org/u/CameronBieganek)\
**Post date:** [March 1, 2022, 2:24am UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185/7 "2022-03-01T02:24:19Z")

</div>

You might be interested in this package:

[https://github.com/ztangent/Julog.jl](https://github.com/ztangent/Julog.jl)

---

<div class="post-metadata">

**Author:** ![Junars](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/junars/32/16094_2.png) [@Junars](https://discourse.julialang.org/u/Junars)\
**Post date:** [March 1, 2022, 2:28am UTC](https://discourse.julialang.org/t/can-metatheory-jl-work-functional-equal-to-prolog/77185/8 "2022-03-01T02:28:25Z")

</div>

Yes，I’m using it in current project. Thx! 😁
