# Re: [julia-users] Horn clauses

```Thanks a lot Cedric. I am just getting to know about Russell and Norvig's
importance thanks to you. I came across articles of theirs some time ago
but didn't know they were pretty much the holy grail. I just came out of a
330 page book from Domingos (even though not mathy) so am catching some
air. I want to implement logical reasoning in Julia. I hope Julia will be
it, and the bible you recommended me. ```
```
On Tuesday, September 20, 2016 at 12:50:44 PM UTC-3, Cedric St-Jean wrote:
>
> It depends what you want to do. Julia's base language doesn't include
> logical reasoning. If you want to translate a Prolog program into Julia,
> you can get away with `if x then y`, but if you want to implement logical
> reasoning, then you need to build some machinery yourself. I would use
> types
>
> immutable Implication
>    precondition
>    consequence
> end
>
> immutable And
>    condition1
>    condition2
> end
>
> ...
>
> then (a && b) => c becomes Implication(And(:a, :b), :c)
>
> Then I would define functions to perform backward-chaining. Julia is quite
> nice for this kind of thing, because of multiple dispatch.
>
> Then of course, you'll need unification/matching for variables, but that's
> not too hard to write either. Read carefully Artificial Intelligence: A
> modern approach, and try to implement its pseudocode in Julia. Write a lot
> of tests to make sure that it works correctly, then slowly move up from
> there. It takes a lot of time to learn mathematics; there are no short-cuts.
>
> Cédric
>
> On Tue, Sep 20, 2016 at 11:25 AM, Kevin Liu <kvt...@gmail.com
> <javascript:>> wrote:
>
>> The negation I'm guessing would be x = false, iff an equivalence of type
>> and value (but in Julia?), implication a combination of if x = true then y
>> = false? Is it as simple as this?
>>
>>
>> On Tuesday, September 20, 2016 at 11:56:46 AM UTC-3, Kevin Liu wrote:
>>>
>>> Would anyone know how to represent logical connectives (e.g. negation ¬,
>>> conjunction ∧, disjunction ∨, material implication ⇒, biconditional iff ⇔)
>>> and quantifiers (e.g. all ∀, exists ∃) in Julia?
>>>
>>> I understand 'all' can be a for loop. Is the conjunction a comma like in
>>> Prolog? Disjunction the 'else' of an if statement? 'Exists' an x = true?
>>>
>>> On Tuesday, September 20, 2016 at 12:31:23 AM UTC-3, Kevin Liu wrote:
>>>>
>>>> Thanks Cedric, read some of that and LilKanren.jl and this is where I
>>>> am with the code (attached). Will continue tomorrow. Feel a bit lost,
>>>> nothing out of the usual.
>>>>
>>>> On Monday, September 19, 2016 at 9:15:43 PM UTC-3, Cedric St-Jean wrote:
>>>>>
>>>>> You might want to roll your own, too. It's instructive, and not
>>>>> particularly hard. Russell and Norvig's textbook has a good section on it.
>>>>>
>>>>> On Monday, September 19, 2016 at 5:44:04 PM UTC-4, Kevin Liu wrote:
>>>>>>
>>>>>> Thanks for the direction, Stefan.
>>>>>>
>>>>>> On Monday, September 19, 2016 at 3:10:19 PM UTC-3, Stefan Karpinski
>>>>>> wrote:
>>>>>>>
>>>>>>> You might try LilKanren.jl <https://github.com/lilinjn/LilKanren.jl>
>>>>>>> .
>>>>>>>
>>>>>>> On Mon, Sep 19, 2016 at 10:21 AM, Kevin Liu <kvt...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hello. What would be the long-term solution for using Horn clauses
>>>>>>>> in Julia? Is the present solution to call Prolog from C and C from
>>>>>>>> Julia?
>>>>>>>> Thanks
>>>>>>>>
>>>>>>>
>>>>>>>
>```