diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 21764b34..4c1bf295 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -19,6 +19,9 @@ module Linguist if languages.all? { |l| ["ECL", "Prolog"].include?(l) } result = disambiguate_ecl(data, languages) end + if languages.all? { |l| ["IDL", "Prolog"].include?(l) } + result = disambiguate_pro(data, languages) + end if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) } result = disambiguate_cl(data, languages) end @@ -51,6 +54,16 @@ module Linguist matches end + def self.disambiguate_pro(data, languages) + matches = [] + if (data.include?(":-")) + matches << Language["Prolog"] + else + matches << Language["IDL"] + end + matches + end + def self.disambiguate_ts(data, languages) matches = [] if (data.include?("")) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index c85fe463..4df5e3ce 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1820,6 +1820,7 @@ Prolog: extensions: - .pl - .ecl + - .pro - .prolog Propeller Spin: diff --git a/samples/Prolog/logic-problem.pro b/samples/Prolog/logic-problem.pro new file mode 100644 index 00000000..b70120bf --- /dev/null +++ b/samples/Prolog/logic-problem.pro @@ -0,0 +1,68 @@ +/** + * Question 1.1 + * combiner(+Buddies, -Pairs) + */ +combiner([], []). +combiner([First|Buddies], Pairs):- + make_pairs(First, Buddies, Pairs1), + combiner(Buddies, Pairs2), + concat(Pairs1, Pairs2, Pairs). + +/** + * make_pairs(+Buddy, +Buddies, -Pairs) + */ +make_pairs(Buddy, [], []). +make_pairs(Buddy, [First|Buddies], [(Buddy, First)|Pairs]):- + make_pairs(Buddy, Buddies, Pairs). + +/** + * concat(+X, +Y, ?T) + */ +concat([], Y, Y). +concat([P|R], Y, [P|T]):- + concat(R, Y, T). + + +/** + * Question 1.2 + * extraire(+AllPossiblePairs, +NbPairs, -Tp, -RemainingPairs) + */ +extraire(AllPossiblePairs, 0, [], AllPossiblePairs). +extraire([PossiblePair|AllPossiblePairs], NbPairs, [PossiblePair|Tp], NewRemainingPairs):- + NbPairs > 0, + NewNbPairs is NbPairs - 1, + extraire(AllPossiblePairs, NewNbPairs, Tp, RemainingPairs), + not(pair_in_array(PossiblePair, Tp)), + delete_pair(RemainingPairs, PossiblePair, NewRemainingPairs). +extraire([PossiblePair|AllPossiblePairs], NbPairs, Tp, [PossiblePair|RemainingPairs]):- + NbPairs > 0, + extraire(AllPossiblePairs, NbPairs, Tp, RemainingPairs), + pair_in_array(PossiblePair, Tp). + +/** + * delete_pair(+Pairs, +Pair, -PairsWithoutPair) + */ +delete_pair([], _, []). +delete_pair([Pair|Pairs], Pair, Pairs):-!. +delete_pair([FirstPair|Pairs], Pair, [FirstPair|PairsWithoutPair]):- + delete_pair(Pairs, Pair, PairsWithoutPair). + +/** + * pair_in_array(+Pair, +Pairs) + */ +pair_in_array((A, B), [(C, D)|Pairs]):- + (A == C ; B == D ; A == D ; B == C), + !. +pair_in_array(Pair, [FirstPair|Pairs]):- + pair_in_array(Pair, Pairs). + + +/** + * Question 1.3 + * les_tps(+Buddies, -Tps) + */ +les_tps(Buddies, Tps):- + combiner(Buddies, PossiblePairs), + length(Buddies, NbBuddies), + NbPairs is integer(NbBuddies / 2), + findall(Tp, extraire(PossiblePairs, NbPairs, Tp, _), Tps). diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index 8bbf0695..55fb5331 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -65,6 +65,18 @@ class TestHeuristcs < Test::Unit::TestCase assert_equal Language["ECL"], results.first end + def test_pro_prolog_by_heuristics + languages = ["IDL", "Prolog"] + results = Heuristics.disambiguate_pro(fixture("Prolog/logic-problem.pro"), languages) + assert_equal Language["Prolog"], results.first + end + + def test_pro_idl_by_heuristics + languages = ["IDL", "Prolog"] + results = Heuristics.disambiguate_pro(fixture("IDL/mg_acosh.pro"), languages) + assert_equal Language["IDL"], results.first + end + def test_ts_typescript_by_heuristics languages = ["TypeScript", "XML"] results = Heuristics.disambiguate_ts(fixture("TypeScript/classes.ts"), languages)